ucOS-II移植到S3C2410笔记之一
时间:11-11
来源:互联网
点击:
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
.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移植S3C241 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)