从第3个断点处点击全速运行时,将不会在任一断点出暂停,为什么?

keil版本:c51v960a
芯片:abov mc96f7系列
本人在使用keil自带的rtx51-tiny系统时,发现通过abov ocd2仿真器仿真时,在每个线程内os_wait函数处打断点,首次运行时3个断点都可以依次暂停,但是从第3个断点处点击全速运行时,将不会在任一断点出暂停,不知道为什么?

代码:
#include <rtx51tny.h>

void task_init(void) _task_ 0
{
//initialize the serial interface
// cli();
// port_init(); // initialize ports
// clock_init(); // initialize operation clock
// BIT_init(); // initialize Basic interval timer
// LCD_init(); // initialize LCD
// Timer3456_init(); // initialize Timer3~5
// WDT_init(); // initialize Watch-dog timer
// WT_init(); // initialize Watch timer
// sei();

//task create
os_create_task(1);
os_create_task(2);
os_create_task(3);
os_delete_task(0);
}

void task_command(void) _task_ 1
{
while(1)
{
os_wait(K_TMO,100,0); //打断点
}
}

void task_clock(void) _task_ 2
{
while(1)
{
os_wait(K_TMO,100,0); //打断点
}
}

void task_blinking(void) _task_ 3
{
while(1)
{
os_wait(K_TMO,100,0); //打断点
}
}

长风秋雁
浏览 185回答 1
1回答

富国沪深

通过单步调试,基本已经能确定是死在下面这段汇编代码里了,但是不知道为何,谁能解释一下?代码:os_switch_task1:; next = current;IF (TIMESHARING <> 0)SETB ?RTX_TS_DELAY ; Delay Task SwitchingENDIFMOV A,?RTX_CURRENTTASKMOV R7,A; while (1) {RL AADD A,#?RTX?TASKSTATE?S+1MOV R0,A?C0001:; if (++next == MAXTASKN+1) next = 0;INC R7INC R0INC R0IF (CPU_IDLE_CODE)MOV A,R7CJNE A,?RTX_CURRENTTASK,NoIDLEJBC ?RTX_ISR_SIG,NoIDLECPU_IDLE ; CPU sleepNoIDLE:ENDIFCJNE R7,#?RTX_MAXTASKN+1,?C0003MOV R7,#0MOV R0,#?RTX?TASKSTATE?S+1?C0003:; if (STATE[next].st & K_READY) break;MOV A,@R0JNB ACC.B_READY,?C0001; }
打开App,查看更多内容
随时随地看视频慕课网APP