您好,
我在使用这个OS的时候,发现一个问题,在中断里调用函数会导致系统挂掉:
我的程序大致描述如下:
除了系统systick中断,只开了一个RTC秒中断。
在RTC中断里每隔一秒输出一个flag,是采用了OS里的isr_SetFlag()函数
void RTC_IRQHandler(void)
{
if (RTC_GetITStatus(RTC_IT_SEC) != RESET)
{
/* Clear the RTC Second interrupt */
RTC_ClearITPendingBit(RTC_IT_SEC);
CoEnterISR();
isr_SetFlag(RTC_flag);
CoExitISR();
// display = 1;
}
}
main.c里建立了4个任务优先级分别为1,2,3,4
在LCD显示任务里,查询中断的标志,如果有,则显示LCD。
//建立一个事件
RTC_flag = CoCreateFlag(1,0);
while(1)
{
//等待秒中断标志
err = CoWaitForSingleFlag(RTC_flag, 100);
if(err == E_OK)
// if(display == 1)
{
// display = 0;
//取当前系统的时间
time_now = Time_GetCalendarTime();
//LCD显示
以下函数省略
…………
}
CoTickDelay (100);
}
另外2个任务是分别点亮2个led,非常简单。
void TSK_LED1(void* pdata)
{
while(1)
{
GPIO_ResetBits(GPIOC, GPIO_Pin_4);
CoTickDelay (500);
GPIO_SetBits(GPIOC, GPIO_Pin_4);
CoTickDelay (500);
}
void TSK_LED2(void* pdata)
{
while(1)
{
GPIO_ResetBits(GPIOC, GPIO_Pin_7);
CoTickDelay (100);
GPIO_SetBits(GPIOC, GPIO_Pin_7);
CoTickDelay (100);
}
}
还有一个任务,什么都不做,只是延迟10ms,原来是按键处理,我屏蔽掉了,一样出问题
void TSK_KEY(void* pdata)
{
while(1)
{
// Key_Task_Entry();
CoTickDelay (10);
}
}
结果运行后发现,在系统运行大概200-2000s左右的时间里必然出现问题。出现问题时的现象表现也不同。
大致表现是,有时不知为何增加了一个优先级为0的dlyNext,delay time为0XFFFFFFFF,导致时间计算出现问题。
有时4个系统任务有的会被删除
有时会死在time.c的InsertDelayList()函数里,表现为dlyNext->TCBnext和dlyNext->TCBprev相等,从而跳不出while循环
我的程序应该都没有问题,因为我如果把OS中断标志修改成全局标志,display。显示时查询这个标志,则运行2天2夜也不会死机
只要改成isr_SetFlag,则肯定会在2000s以内出问题。
以上是我在调试时发现的一个问题,比较严重。请验证。
osconfig里只修改了如下:
#define CFG_SYSTICK_FREQ (1000)
其他未做修改。 |