打印

请教ARM中的中断和任务以及优先权的问题

[复制链接]
1407|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xiaoxi125|  楼主 | 2011-10-7 17:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
目的: 中断发生时,Task1才能发生而且是在中断结束后立即进行,Task1发生过程中延时时,将CPU使用权转给比它优先级低的Task2.,从而使Task2得以进行并通过save()函数将中断的信息存储。
做法:
1)初始化时建立了信号量RxSem =
OSSemCreate(0);
并设置了Task1的优先权高于Task2

2Rx中断时,通过函数OSSemPost(),将信号量的使用权转给包含
OSSemPend()
函数的Task1

程序大体如下:
void Uart1_RxInt(void)
{
U8 data, LRC, i;


data = RdURXH2();


SerRxCh = data;


OSSemPost(RxSem); //


CommRxQueuePut(2,data);


OSPrintf("Uart2 %c",data);


ClearSubPending(BIT_SUB_RXD2);
// Clear Sub int pending}

Void Task1(void)
{int m;
OSSemPend(RxSem,0,&err);
m++;
OSTimeDly(1000);}
Void Task2(void)
{int n;
n++;
save();
OSTimeDly(10000);}
在进行1,2以外的任务发生中断时,程序按照预想的进行。但是当在Task2执行中也就是在中断信息存储过程中又发生新的中断时,Task1m为什么跟原来一样?是Task1不进行还是什么原因?我认为既然Task1的优先权高于Task2,而且整个Project中只有Task1中用到
OSSemPend()
函数,中断结束后它没道理不执行。。。谁能指点下。。。不胜感激。。。。

相关帖子

沙发
xinzha| | 2011-10-7 19:36 | 只看该作者
如果实现没有问题的话,对于一个严谨的编译器来说,m的值有0和1两种可能,而比较随意的编译器就是一个不定的初始值和这个值加1.

使用特权

评论回复
板凳
xiaoxi125|  楼主 | 2011-10-10 08:42 | 只看该作者
如果实现没有问题的话,对于一个严谨的编译器来说,m的值有0和1两种可能,而比较随意的编译器就是一个不定的初始值和这个值加1.
xinzha 发表于 2011-10-7 19:36

感谢你的回复,但是...
现在不是0和1的问题,是task2进行中发生中断的话,task1的计数不正常,而中断不是在task2进行中发生的话,task1的计数正常。这是为什么?怎么解决?

使用特权

评论回复
地板
xinzha| | 2011-10-11 13:07 | 只看该作者
猜测是task2的save对中断信息操作时搞出了问题。

使用特权

评论回复
5
xiaoxi125|  楼主 | 2011-10-11 18:32 | 只看该作者
虽然还没解决,但感谢你的关注。。。

使用特权

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

本版积分规则

3

主题

15

帖子

1

粉丝