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 createos_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); //打断点}}
1 回答
富国沪深
TA贡献1790条经验 获得超9个赞
通过单步调试,基本已经能确定是死在下面这段汇编代码里了,但是不知道为何,谁能解释一下?
代码:
os_switch_task1:
; next = current;
IF (TIMESHARING <> 0)
SETB ?RTX_TS_DELAY ; Delay Task Switching
ENDIF
MOV A,?RTX_CURRENTTASK
MOV R7,A
; while (1) {
RL A
ADD A,#?RTX?TASKSTATE?S+1
MOV R0,A
?C0001:
; if (++next == MAXTASKN+1) next = 0;
INC R7
INC R0
INC R0
IF (CPU_IDLE_CODE)
MOV A,R7
CJNE A,?RTX_CURRENTTASK,NoIDLE
JBC ?RTX_ISR_SIG,NoIDLE
CPU_IDLE ; CPU sleep
NoIDLE:
ENDIF
CJNE R7,#?RTX_MAXTASKN+1,?C0003
MOV R7,#0
MOV R0,#?RTX?TASKSTATE?S+1
?C0003:
; if (STATE[next].st & K_READY) break;
MOV A,@R0
JNB ACC.B_READY,?C0001
; }
添加回答
举报
0/150
提交
取消