|
发表于 2009-1-2 10:23:11
|
显示全部楼层
"首先说一下,我对UCOS非常熟悉,官方一直的代码也有缺陷。因为开始的时候想使用UCOS在在STM32上。阅读了他的代码,发现了有些地方做的不好。
你说的对,官方对自己的代码更熟悉。但是官方不一定对每一种处理器都非常熟悉。也难免出问题。"
牛人真多呀
官方的临界代码:
OS_CPU_SR_Save
MRS R0, PRIMASK
CPSID I
BX LR
OS_CPU_SR_Restore
MSR PRIMASK, R0
BX LR
官方首先把服务处理优先级降到最低了,这样可以解决硬件优先级的一些冲突
OSStartHighRdy
LDR R0, =NVIC_SYSPRI14 ;// 设置PendSV优先级
LDR R1, =NVIC_PENDSV_PRI;//255
STRB R1, [R0]
...
...
下面是触发文本切换,只是触发,不一定马上切换
OSCtxSw
LDR R0, =NVIC_INT_CTRL
LDR R1, =NVIC_PENDSVSET
STR R1, [R0]
BX LR
官方还给出一种利用CM3硬件特性计算优先级的代码,这在大于64个任务的时候,计算优先级还是很快的,如果RAM足够,可以很容易扩充任务数32 * 32个任务
OS_SchedNew
PUSH {R0-R4}
LDR R0, =OSRdyGrp
LDRH R2, [R0]
RBIT R2, R2
CLZ R2, R2 ; y = CLZ(OSRdyGrp);
LDR R0, =OSRdyTbl
ADD R1, R0, R2, LSL #0x01 ; ptbl = &OSRdyTbl[y];
LDRH R3, [R1]
RBIT R3, R3
CLZ R3, R3 ; x = CLZ(*ptbl);
LDR R0, =OSPrioHighRdy
ADD R4, R3, R2, LSL #0x04
STRB R4, [R0] ; OSPrioHighRdy = x + (y << 4);
POP {R0-R4}
BX LR
本贴被 laoma 编辑过,最后修改时间:2009-01-02,10:30:07. |
|