|
本帖最后由 styleno1 于 2014-8-29 17:24 编辑
硬件接口:STM32 SPI2 <--> SPI Flash,@18M。
工作逻辑:使用DMA1的CH4与CH5,用于获得最佳的读写SPI Flash速度。由于SPI的工作逻辑,两通道必须同时开启,然后由中断发送各自标志组对应位。
任务级代码:
- OSFlagPost(pSPI_Flash_Flags, FLAGS_SPI_RW_DONE, OS_FLAG_CLR, &Err);
- OS_ENTER_CRITICAL();
- DMA_Cmd(DMA1_Channel4, ENABLE);
- DMA_Cmd(DMA1_Channel5, ENABLE);
- OS_EXIT_CRITICAL();
- OSFlagPend(pSPI_Flash_Flags, FLAGS_SPI_RW_DONE, OS_FLAG_WAIT_SET_ALL | OS_FLAG_CONSUME, 0, &Err);
复制代码
其中:
- /* 标志组标志位 */
- #define FLAGS_SPI_RX_DONE 0x10
- #define FLAGS_SPI_TX_DONE 0x20
- #define FLAGS_SPI_RW_DONE 0x30
复制代码
异常现象描述:
当传输数据长度短于24字节时,任务切换出现错乱。
现象虽然是任务在空闲任务中运行,但任务堆栈已被破坏。
全程DMA表现正常,标志组状态位值正常。
常规分析:
在此通信速度下,事件在阻塞前开始发生,有可能在OSFlagPend()尚未完成任务调度前,事件标志位置位,引起的问题。
仿真时的异常关键点:
在OSFlagPend()的OS_Sched()临界段内、DMA中断设置断点,全速运行,率先到达OS_Sched()的临界段:
意味着先置位了软中断,然而此时DMA中断标志已经置位:
执行出临界段,先响应DMA的中断,这时中断退出的系统调用触发OSIntCtxSw(),此次会导致PSV标志位溢出。
随后第二个DMA中断发生,2个标志组置位使任务就绪,此时判定最高优先级等于该任务,不会触发调度。
由前文可知,此时一次软件中断已经等待多时,发生了一次自己跟自己的调度。。。呜呼!
- OS_CPU_PendSVHandler
- CPSID I ; Prevent interruption during context switch
- MRS R0, PSP ; PSP is process stack pointer
- CBZ R0, OS_CPU_PendSVHandler_nosave ; Skip register save the first time
- SUBS R0, R0, #0x20 ; Save remaining regs r4-11 on process stack
- STM R0, {R4-R11}
- LDR R1, =OSTCBCur ; OSTCBCur->OSTCBStkPtr = SP;
- LDR R1, [R1]
- STR R0, [R1] ; R0 is SP of process being switched out
- ; At this point, entire context of process has been saved
- OS_CPU_PendSVHandler_nosave
- PUSH {R14} ; Save LR exc_return value
- LDR R0, =OSTaskSwHook ; OSTaskSwHook();
- BLX R0
- POP {R14}
- LDR R0, =OSPrioCur ; OSPrioCur = OSPrioHighRdy;
- LDR R1, =OSPrioHighRdy
- LDRB R2, [R1]
- STRB R2, [R0]
- LDR R0, =OSTCBCur ; OSTCBCur = OSTCBHighRdy;
- LDR R1, =OSTCBHighRdy
- LDR R2, [R1]
- STR R2, [R0]
- LDR R0, [R2] ; R0 is new process SP; SP = OSTCBHighRdy->OSTCBStkPtr;
- LDM R0, {R4-R11} ; Restore r4-11 from new process stack
- ADDS R0, R0, #0x20
- MSR PSP, R0 ; Load PSP with new process SP
- ORR LR, LR, #0x04 ; Ensure exception return uses process stack
- CPSIE I
- BX LR ; Exception return will restore remaining context
- END
复制代码
问题:该推理是否正确?如何解决此类问题?(如果从我的假设出发,加入优先级比较即可)
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|