×
单片机 > 单片机程序设计 > 详情

ucOS-II移植到S3C2410笔记之一

发布时间:2020-05-23 发布时间:
|
1:  问题: 移植汇编函数:OSStartHighRdy, 如下,但发现只有OS_TaskIdle一个任务时,都不能正确运行。
 .globl   OSStartHighRdy
   .type     OSStartHighRdy,  %function
 OSStartHighRdy:
 
     /*  C variable OSRunning = TRUE */
   
     mov   r0, #1
     ldr   r1, =OSRunning
     str   r0, [r1]
 
     /* get the stack pointer of task that will be running.  */
     ldr   r5, =OSTCBHighRdy     /* R0= the address  of  pointer variable OSTCBHighRdy */
     ldr   r6, [r5]              /* R1= the the value of pointer variable OSTCBHighRdy= OS_TCB(TaskIdle) */
     ldr   r7, [r6]              /* R2= the value of pointer variable OS_TCB->OSTCBStkPtr, the value is address*/  
     /*ldr   r8, [r7]*/              /* R3= the value of pointer*/
 
     mov   sp, r7           /* restore  SP*/
 
     ldr   r1, [sp, #0]
     msr   cpsr, r1         /* restore  CPSR */
 
     add   sp, sp, #4        /* pointer to R0 location */
     ldmia sp!,{r0-r12, lr, pc}   /* restore  R0-R12, LR, PC  */

2:实验,删掉如下代码(OSRunning=1,即上面红色部分代码)后,系统正常。

3:分析
    说明系统是在执行OSRunning=1对应的汇编代码出现异常,于是查看变量OSRunning的定义:
    ucos_ii.h:451:OS_EXT  BOOLEAN           OSRunning;
    再查看BOOLEAN的原始类型:
    os_cpu.h:42:typedef unsigned char  BOOLEAN;
    即变量OSRunning是unsigned char类型,至此,问题的原因已经找到,即错误的使用了汇编指令。
    因为汇编访问C语言的变量时,需要根据变量的类型,而确定其汇编指令,这里应该使用:ldrb/strb
4:   修正后的代码
      mov   r0, #1
      ldrb   r1, =OSRunning
      strb   r0, [r1]
5: 总结
      汇编在访问C语言的变量时,需要根绝变量的类型使用不同的汇编指令:
     
      unsigned   char    ----------------------->   LDRB/STRB
      unsigned   short   ----------------------->   LDRH/STRH
      unsigned   int       ----------------------->    LDR/STR
      char                     ----------------------->    LDRSB/STRSB
      short                    ----------------------->    LDRSH/STRSH
关键字:ucOS-II  移植  S3C2410 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
51单片机CO2检测显示程序解析