金牌会员
- 积分
- 1571
- 金钱
- 1571
- 注册时间
- 2015-8-9
- 在线时间
- 624 小时
|
楼主 |
发表于 2016-10-9 19:32:51
|
显示全部楼层
感谢@zuozhongkai @FreeRTOS 的提示和解答,今天再修改了一下delay.c函数,在SysTick_Handler()里加入系统启动判断:
[mw_shl_code=applescript,true]//systick中断服务函数,使用ucos时用到
void SysTick_Handler(void)
{
#ifdef OS_CRITICAL_METHOD //如果OS_CRITICAL_METHOD定义了,说明使用ucosII了.
OSIntEnter(); //进入中断
OSTimeTick(); //调用ucos的时钟服务程序
OSIntExit(); //触发任务切换软中断
#endif
#ifdef FreeRTOS
if(OSRunning==1) //系统在运行
{
xPortSysTickHandler();
}
#endif
}
[/mw_shl_code]
这样系统就能在没有启动调度器的情况下,调用延时和串口打印函数也能正常运行。
新的问题又来了:
USART1_IRQHandler()里模仿ucos调用了taskENTER_CRITICAL_FROM_ISR(),taskEXIT_CRITICAL_FROM_ISR()作为中断屏蔽,追踪源码,是一段汇编,,,
[mw_shl_code=applescript,true]//taskENTER_CRITICAL_FROM_ISR()
__asm uint32_t ulPortSetInterruptMask( void )
{
PRESERVE8
mrs r0, basepri
mov r1, #configMAX_SYSCALL_INTERRUPT_PRIORITY
msr basepri, r1
bx r14
}
/*-----------------------------------------------------------*/
//portCLEAR_INTERRUPT_MASK_FROM_ISR()
__asm void vPortClearInterruptMask( uint32_t ulNewMask )
{
PRESERVE8
msr basepri, r0
bx r14
}
/*-----------------------------[/mw_shl_code]
能指点迷津?
附:修正后的工程
|
|