中级会员
- 积分
- 320
- 金钱
- 320
- 注册时间
- 2018-2-1
- 在线时间
- 67 小时
|
50金钱
问题如下:
将OS的入口地址设置sModeSwitch,然后通过事件进入sModeSwitch。
在Keil 中Debug跑的话运行逻辑是:OSInit ----》OSEventSend -----》进入sModeSwitch -------》退出sModeSwitch ------》while (1),
但把程序下载到51单片机运行的话是进入sModeSwitch循环体里出不来了,永远运行不到while(1)这里来。
这代码在STM8里跑是正常的,移植到51上就不行了,不知道是不是SP堆栈指针的区别造成的,stm8 的堆栈指针是16位的,51的是8位。
各位大神请不吝赐教!
void main(void)
{
OSInit((INT16U)sModeSwitch);
OSEventSend(cbEventPowerOn);
while (1)
{
;;;;;;
}
}
void OSInit(INT16U wIniEntry)
{
INT16U T1,T2,T3;
T1 = wIniEntry & 0xFF;
T2 = wIniEntry >> 8;
wIniEntry = (T1<<8)+(T2);
*((OS_STK *)(cwSpForOsMin)) = (OS_STK)wIniEntry;
OSModeSp = (INT16U)(cwSpForOsMin + 1);
}
void OSModeEnter(void)
{
OSMainOrIntSp = SP;
SP = OSModeSp;
}
void OSModeExit(void)
{
OSModeSp = SP;
SP = OSMainOrIntSp;
}
OS_EVENT OSMaskEventPend(OS_EVENT Mask)
{
OS_EVENT Event;
OSEventBitMask = Mask;
Event = (OSEvent & OSEventBitMask);
if(Event == 0)
{
OSModeExit();
Event = (OSEvent & OSEventBitMask);
}
OSEvent &= (~OSEventBitMask);
return (Event);
}
void OSEventSend(OS_EVENT bEvent)
{
OS_EVENT Event;
OS_ENTER_CRITICAL();
OSEvent |= bEvent;
Event = (OSEvent & OSEventBitMask);
if(Event)
{
OSModeEnter();
}
OS_EXIT_CRITICAL();
}
|
|