为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

长风秋雁 2022-06-15 15:11:30
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
; }


查看完整回答
反对 回复 2022-06-20
  • 1 回答
  • 0 关注
  • 184 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信