ucos基于stm32上的移植_第1页
ucos基于stm32上的移植_第2页
ucos基于stm32上的移植_第3页
ucos基于stm32上的移植_第4页
ucos基于stm32上的移植_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论