




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、ucos-ii和ucgui基于stm32上的移植uc/os-ii移植笔记os_cpu.h与编译器相关的数据类型typedef unsigned char BOOLEAN;typedef unsigned char INT8U; &
2、#160; /* Unsigned 8 bit quantity */typedef signed char INT8S; /* Signed
3、 8 bit quantity */typedef unsigned short INT16U; /* Unsigned 16 bit quantity */typedef
4、; signed short INT16S; /* Signed 16 bit quantity */typedef unsigned int
5、 INT32U; /* Unsigned 32 bit quantity */typedef signed int INT32S;
6、; /* Signed 32 bit quantity */typedef float FP32; &
7、#160; /* Single precision floating point*/typedef double FP64;
8、; /* Double precision floating point */typedef unsigned int OS_STK; /*
9、 堆栈类型为32位 Each stack entry is 32-bit wide */typedef unsigned int OS_CPU_SR; /* Define size of CPU
10、60;status register (PSR = 32 bits) */与ARM 处理器相关的代码#define OS_CRITICAL_METHOD 3 /进入临界段的方法#if OS_CRITICAL_METHOD = 3#define OS_ENTER_CRITICAL()
11、; cpu_sr = OS_CPU_SR_Save(); /关中断#define OS_EXIT_CRITICAL() OS_CPU_SR_Restore(cpu_sr); /开中断#endif#if OS_CRITICAL_METHOD = 3OS_CPU_SR OS_CPU_SR_Save(void);void OS_CPU_SR_
12、Restore(OS_CPU_SR cpu_sr);#endifvoid OSCtxSw(void);void OSIntCtxSw(void);void OSStartHighRdy(void);设置堆栈的增长方向#define OS_STK_GROWTH 1
13、/*堆栈由高地址向低地址增长*/OS_CPU_C.C用C 语言编写六个操作系统相关的函数OS_STK *OSTaskStkInit ( void (*task)(void *p_arg), void *p_arg, OS_STK *ptos,INT16U opt) OS_STK *stk; (void
14、)opt; /* 'opt' is not used, prevent warning
15、0; */ stk = ptos;
16、; /* Load stack pointer */
17、60; /* Registers stac
18、ked as if auto-saved on exception */ *(stk) = (INT32U)0x01000000L; /* xPSR
19、60; */ *(-stk) = (INT32U)task;
20、0; /* Entry Point
21、0; */ *(-stk) = (INT32U)0xFFFFFFFEL; /* R14 (LR) (init value will cause
22、fault if ever used)*/ *(-stk) = (INT32U)0x12121212L; /* R12
23、60; */ *(-stk) = (INT32U)0x03030303L;
24、60; /* R3
25、; */ *(-stk) = (INT32U)0x02020202L; /* R2 &
26、#160; */ *(-stk) = (INT32U)0x01010101L; &
27、#160; /* R1
28、60; */ *(-stk) = (INT32U)p_arg; /* R0 : argument
29、160; */
30、 /* Remaining registers saved on process stack
31、60; */ *(-stk) = (INT32U)0x11111111L; /* R11
32、0; */ *(-stk) = (INT32U)0x10101010L;
33、0; /* R10
34、; */ *(-stk) = (INT32U)0x09090909L; /* R9 &
35、#160; */ *(-stk) = (INT32U)0x08080808L; &
36、#160; /* R8
37、60; */ *(-stk) = (INT32U)0x07070707L; /* R7
38、; */ *(-stk) = (INT32U)0x06060606L;
39、; /* R6 &
40、#160; */ *(-stk) = (INT32U)0x05050505L; /* R5
41、60; */ *(-stk) = (INT32U)0x04040404L;
42、60; /* R4
43、; */ return (stk);void OSTaskCreateHook (OS_TCB *ptcb) ptcb=ptcb;/防止编译时出现警告 void OSTaskDelHook (OS_TCB *ptcb) ptcb=ptcb;/防止编译时出现警告 void OSTaskSwHook (void
44、) void OSTaskStatHook (void) void OSTimeTickHook (void) 后5 个函数为钩子函数,可以不加代码。OS_CPU_A.ASM用汇编语言编写四个与处理器相关的函数;/ 引用外部变量的声明 EXTERN OSRunning EXTERN OSPrioCur
45、0; EXTERN OSPrioHighRdy EXTERN OSTCBCur EXTERN OSTCBHighRdy EXTERN OSIntNesting E
46、XTERN OSTaskSwHook EXTERN OSRdyGrp EXTERN OSRdyTbl EXTERN OSPrioHighRdy;/ 外部可以调用的函数 PUBLIC OS_CPU_SR_Save PUBLIC O
47、S_CPU_SR_Restore PUBLIC OSStartHighRdy PUBLIC OSCtxSwPUBLIC OSIntCtxSw ;/以上5个函数在os_cpu_c.c文件下有声明PUBLIC PendSVC /此函数在stm3210x_it.c stm32f10x_it.h stm32f10x_vector.c文件
48、下有声明;/*;/ PendSV 所使用的几个寄存器;/*NVIC_INT_CTRL EQU 0xE000ED04 &
49、#160; / 中断控制及状态寄存器NVIC_SYSPRI14 EQU 0xE000ED22 / 控制PendSV优先级的寄存器NVIC_PENDSV_PRI EQU
50、160;0xFF / PendSV 异常优先级(最低)NVIC_PENDSVSET EQU 0x10000000 / PendSV 异常触发位掩码(1) OSStartHighRdy( );运行优先级最高的就绪任务OSStartHigh
51、Rdy LDR R0, =NVIC_SYSPRI14 / 设置PendSV优先级 &
52、#160; LDR R1, =NVIC_PENDSV_PRI STRB R1, R0 MOVS R0, #0
53、60; / 初始化线程PSP MSR PSP, R0 LDR R0, =OS
54、Running / OSRunning = TRUE MOVS
55、0;R1, #1 STRB R1, R0 LDR R0, =NVIC_INT_CTRL
56、 / 触发PendSV异常, 让PendSv任务切换开始 LDR R1, =NVIC_PENDSVSET STR R1, R0 CPSIE I
57、 / 打开总中断OSStartHangB
58、 OSStartHang / while(1);(2)OSCtxSw();任务
59、级的任务切换函数OSCtxSw LDR R0, =NVIC_INT_CTRL /
60、 触发PendSV异常 LDR R1, =NVIC_PENDSVSET STR R1, R0BX LR(3)OSIntCtxSw();中断级的任务切换函数OSIntCtxSw LDR R0
61、, =NVIC_INT_CTRL / 触发PendSV异常 LDR R
62、1, =NVIC_PENDSVSET STR R1, R0BX LR(4)OSTickISR();中断服务函数未添加(5)临界段代码OS_CPU_SR_Save MRS R0, PRIMASK CPSID I
63、160; BX LROS_CPU_SR_Restore MSR PRIMASK, R0BX LR(6)PendSVC代码在cm3内核下,真正的任务文本切换是靠本函数实现PendSVC CPSID I
64、; / 任务context切换是关闭中断 MRS R0,
65、 PSP / 获取PSP CBZ R0, OS_CPU_PendSVHa
66、ndler_nosave / 在多任务初始化时,PSP被初始化为0
67、; / PSP如果是0,标示任务没有运行过,那么不需要压栈
68、60; / 直接加载任务context SUBS R0, R0, #0x20
69、0; / 调整PSP指针, R4-R11 共32字节 STM R0, R4-R11
70、160; / 压栈R4-R11, 其他8个寄存器是在异常时自动压栈的 LDR R1, =OSTCBCur
71、160; / 获取OSTCBCur->OSTCBStkPtr LDR R1, R1 STR R0, R1 &
72、#160; / 将当前任务的堆栈保存到自己的任务控制块
73、; / OSTCBCur->OSTCBStkPtr = PSP
74、 / 程序运行此位置,已经保存了当前任务的conte
75、xt了OS_CPU_PendSVHandler_nosave / 使能OSTaskSwHook的时候去掉注释 /PUSH R14 /LDR R0, =OSTaskSwHook /BLX R0
76、0;/POP R14
77、60; / 在调度之前,系统内核已经计算好
78、; / OSPrioHighRdy 和 OSTCBHighRdy LDR R0, =OSPrioCur
79、0; / 当前任务优先级 = 就绪任务优先级 LDR R1, =OSPrioHighRdy / OSPrioCur = OSPrioHighRdy;
80、60; LDRB R2, R1 STRB R2, R0 LDR R0, =OSTCBCur /
81、;当前任务控制块 = 就绪任务控制块; LDR R1, =OSTCBHighRdy / OSTCBCur = OSTCBHighRdy; LDR R2, R1
82、; / STR R2, R0
83、160; / 此时 R2 = 新任务的PSP LDR R0, R2
84、; / R0 = 新任务的PSP LDM R0, R4-R11
85、 / 出栈 R4 - R11 ADDS R0, R0, #0x20
86、 / 调整PSP MSR PSP, R0
87、60; /
88、160; / 当前异常使用的堆栈是MPS ORR LR, LR, #0x04
89、0; / 修改LR的BIT2=1, 确保异常退出时堆栈使用PSP &
90、#160; / 类似修改CONTROL1 = 1 CPSI
91、E I BX LR
92、 / 异常返回END在引用头文件中需要包含宏定义 #define OS_GLOBALSucgui移植笔记在源文件夹的StartGUILCDDriver下有个LCDDummy.c文件,主要修改此文件与自己的lcd驱动文件进行链接。主要修改以下这两个函数就可以了:unsigned int LCD_L0_GetPixelIndex(int x, int y)void LCD_L0_SetPixelIndex(int
93、 x, int y, int PixelIndex)移植步骤: 第一步:首先,得把你的TFT底层驱动和触摸驱动写好,既在裸机下,可以正常显示并实现触摸。 第二步:加入UCGUI程序包。 第三步:配置LCDConf.h GUIConf.h GUITouchConf.h配置LCDConf.h文件如下:#ifndef LCDCONF_H#define LCDCONF_H#define LCD_XSIZE
94、 (240) /*X轴分辨率 */#define LCD_YSIZE (320) /* Y轴分辨率 */#define LCD_BITSPERPIXEL (16) /像素位数#define LCD_FIXEDPALETTE (565) /颜色模板 /#define LCD_SWAP_RB &
95、#160; (1)/以下两部分在LCDDummy.c文件中要用到#define LCD_CONTROLLER 9320 /控制器型号的配置 #define LCD_INIT_CONTROLLER() Touch_Initializtion();ili9320_Initializtion() /LCD初始化
96、; #endif 在LCDDummy.c文件中,需要修改以下3个函数和一个宏判断,并添加
97、自己的lcd驱动头文件(1)宏修改#if (LCD_CONTROLLER = -1) && (!defined(WIN32) | defined(LCD_SIMCONTROLLER)此处 将 -1 改为 9320 ,以对应上面的配置。(2)LCD_L0_Init 初始化lcd函数int LCD_L0_Init(void) LCD_INI
98、T_CONTROLLER() /对应LCDConf.h文件中的宏定义 return 0;(3)LCD_L0_GetPixelIndex unsigned int LCD_L0_GetPixelIndex(int x , int y) LCD_PIXELINDEX PixelIndex;
99、 /* Convert logical into physical coordinates (Dep. on LCDConf.h) */ #if LCD_SWAP_XY | LCD_MIRROR_X| LCD_MIRROR_Y int xPhys = LOG2PHYS_X(x, y); int
100、 yPhys = LOG2PHYS_Y(x, y); #else #define xPhys x #define yPhys y #endif /* Read from hardware . Adapt to your system 需要自己添加的部分*/
101、160; PixelIndex = 0; /* . */ ili9320_SetCursor(x,y); LCD_WriteRAM_Prepare(); PixelIndex = LCD_ReadRAM(); return PixelIndex;
102、0; return PixelIndex;(4)LCD_L0_SetPixelIndexvoid LCD_L0_SetPixelIndex (int x , int y , int PixelIndex) /* Convert logical into physical coordinates (Dep. on LCDCo
103、nf.h) */ #if LCD_SWAP_XY | LCD_MIRROR_X| LCD_MIRROR_Y int xPhys = LOG2PHYS_X(x, y); int yPhys = LOG2PHYS_Y(x, y); #else #define xPhys x #define yPhys y #endif /* Write into hardware . Adapt to your system 以下部分需要自己去写的,对应自己的lcd驱动文件*/ /* . */&
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- T-ZZB 1584-2023 低压电源系统的电涌保护器(SPD)
- 二零二五年度专业技术师徒传承合作合同
- 2025年度门店合作线上线下融合营销协议
- 二零二五年度不占股份分红权益共享协议
- 二零二五年度招商引资合同中的政府与企业合作模式创新
- 2025年度终止供货协议函范文模板与签订程序指导
- 二零二五年度绿色建筑产业厂房租赁服务协议
- 二零二五年度劳动合同法未签订合同员工竞业禁止协议
- 二零二五年度物业安全管理人员劳动合同范本
- 二零二五年度消防安全设施设备安全评估与整改服务合同
- 幼儿园讲课上呼吸道感染预防培训课件
- 中国传媒大学《主持人即兴口语表达》课件-第1章 主持人即兴口语表达概述
- 工程分包计划(完整版)
- CIR操作指南(20110513)
- 领导力培训领导力提升培训领导力培训
- 制药工程 专业英语 Unit 1(课堂PPT)
- 俞敏洪四级词汇词根联想记忆法乱序wordlist
- 第四次工业革命ppt课件
- 公路工程试验常规检测项目、检测标准、检测频率、取样方法(标准版)
- 图解调音台使用说明(共14页)
- 员工人事档案登记表(最终版)
评论
0/150
提交评论