打印
[技术问题解答]

关于在MQX Lite系统中task被GPIO中断抢占饿死的问题

[复制链接]
1809|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
韬铸88|  楼主 | 2015-8-11 11:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在学习kinetis K22芯片,移植入MQX Lite系统,发现在建一个task,一个外设GPIO口设置为外部中断。
1、外部输入中断信号使得产生中断的频率为1KHz.中断服务程序中,只有一条打印语句printf("into GPIO interrupt!\r\n");
2、任务task的优先级设置为2。外部GPIO中断优先级设置为8。
3、系统时钟滴答SysTick周期设置为5ms,中断优先级默认为8。
外部中断服务程序函数:
void ExtInt_OnInterrupt(void)
{
      printf("into GPIO interrupt!\r\n");
}

任务函数:
void Task1_task(uint32_t task_init_data)
{
   int counter = 0;
   while(1) {
      counter++;
      /*Write your code here... */
     printf("Task1_task is running!\r\n");
     _time_delay_ticks(1);
    }
}

系统运行的结果是:
Task1_task is running!
into GPIO interrupt!
into GPIO interrupt!
into GPIO interrupt!
into GPIO interrupt!
into GPIO interrupt!
into GPIO interrupt!
into GPIO interrupt!
into GPIO interrupt!
into GPIO interrupt!
into GPIO interrupt!
into GPIO interrupt!
into GPIO interrupt!
.........
这样一直打印 into GPIO interrupt! 而未执行到任务打印 Task1_task is running!。
如果外部输入中断信号使得产生中断的频率小些,为30Hz.那么系统执行的情况是:
Task1_task is running!
into GPIO interrupt!
into GPIO interrupt!
into GPIO interrupt!
into GPIO interrupt!
into GPIO interrupt!
into GPIO interrupt!
into GPIO interrupt!
into GPIO interrupt!
into GPIO interrupt!
into GPIO interrupt!
into GPIO interrupt!
into GPIO interrupt!
Task1_task is running!
into GPIO interrupt!
into GPIO interrupt!
into GPIO interrupt!
into GPIO interrupt!
into GPIO interrupt!
into GPIO interrupt!
into GPIO interrupt!
into GPIO interrupt!
into GPIO interrupt!
into GPIO interrupt!
into GPIO interrupt!
into GPIO interrupt!
................
这样的话,任务在一定的时间间隔后,还是可以得到执行的,不至于被中断抢占到饿死,无法执行。
那为什么在外部中断频率高了,就会出现任务被饿死呢?怎么才能解决这个问题?请各位能给予指点一下,谢谢!

相关帖子

沙发
FSL_TICS_DANIEL| | 2015-8-13 10:30 | 只看该作者
请将Systick的中断优先级设置为2再试试看, 它是调度用的,优先级应该高一些。

使用特权

评论回复
板凳
FSL_TICS_DANIEL| | 2015-8-13 10:30 | 只看该作者
另外任务的优先级设置的低一些

使用特权

评论回复
地板
韬铸88|  楼主 | 2015-8-13 22:51 | 只看该作者
FSL_TICS_DANIEL 发表于 2015-8-13 10:30
另外任务的优先级设置的低一些

我的理解是由于串口设的波特率为115200,所以每毫秒可以发送14个byte。而在中断中,打印语句是“into GPIO interrupt!”,大于14个byte,所用的时间超过了1ms。所以中断服务程序还没有执行完,由于是1KHz频率的中断,周期是1ms,这样又产生一次中断。似乎是外部中断的优先级比较高,总会抢占系统软中断。所以系统任务task得不到执行。
而当外部中断设置为30Hz时候,周期为33.33ms,打印语句所用的时间小于中断周期时间。中断服务程序执行完推出后,让给任务执行。准备就绪的任务此时抢占了CPU,执行打印语句“Task1_task is running!”,打印完这条语句后,执行延时函数,保存现场,上下文切换,进入延时睡眠5ms多。

使用特权

评论回复
5
韬铸88|  楼主 | 2015-8-13 22:56 | 只看该作者
FSL_TICS_DANIEL 发表于 2015-8-13 10:30
请将Systick的中断优先级设置为2再试试看, 它是调度用的,优先级应该高一些。  ...

我想请教一下,K22系列中,内置有DSP,如何操作DSP呢?芯片参考手册、数据手册上没有看到写到如何操作呀,还是我没有注意看到。在哪里可以找到操作内置DSP的相关资料?谢谢!

使用特权

评论回复
6
ccw1986| | 2015-8-14 09:26 | 只看该作者
systick应该设置优先级高一些比较好吧

使用特权

评论回复
7
韬铸88|  楼主 | 2015-8-14 22:38 | 只看该作者
ccw1986 发表于 2015-8-14 09:26
systick应该设置优先级高一些比较好吧

嗯,的确比较好

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

126

帖子

1

粉丝