中级会员
- 积分
- 253
- 金钱
- 253
- 注册时间
- 2016-5-4
- 在线时间
- 58 小时
|
1金钱
任务1和任务2的函数当中:
在此例程中,任务1的优先级是4,任务2的优先级是5,任务1优先级高于任务2,按照我的理解,任务开始后,
首先执行任务1,173行,打印字符串,printf("\r\n任务1:\r\n");
接下来按顺序执行到175行,请求信号量,由于信号量创建时初始值是1,执行完这一行之后信号量变成0并且继续执行下去无需等待
接下来按顺序执行到177行,delay_ms(300);引起任务切换,切换到任务2
开始进入任务2,按顺序执行到192行,打印字符串,printf("\r\n任务2:\r\n");
接下来按顺序执行到194行,请求信号量,此时任务阻塞
待任务1的延时结束后,继续从178行开始执行,打印字符串,printf("%s\r\n",share_resource);
接下来按顺序执行到179行,发送信号量
紧接着任务2中的194行等待信号量已经等待完毕,接着执行
按顺序执行到197行,打印字符串,printf("%s\r\n",share_resource);
接下来按顺序执行到198行,发送信号量
第一个过程到此结束,按照预想此时串口接收到的数据应当是(花括号内的内容):
{
任务1:
任务2:
First task Running!
Second task Running!
}
到此没有问题,现象和预想的一样,接下来疑惑在下方。
任务2执行完之后,继续回到任务1,任务1从头开始运行直到175行请求信号量,由于刚才的任务2已经发送了信号量
所以此时信号量通过无需阻塞,将信号量减1变为0之后继续执行下去。直到177行,任务延时delay_ms(300);引发任务调度。
那么此时应该是切换到任务2,任务2从头开始执行,经过192行打印出printf("\r\n任务2:\r\n");
之后遇到194行,请求信号量,阻塞在此。
待任务1延时结束后,打印printf("%s\r\n",share_resource);之后紧接着发送信号量,然后任务2继续执行下去,打印printf("%s\r\n",share_resource);
OK疑点在此,按照上述分析,任务1发送完printf("\r\n任务1:\r\n");之后,(176行请求信号量通过)在177行处引发调度,执行任务2,打印完printf("\r\n任务2:\r\n");之后,才开始遇到请求信号量。
按照预想, 串口接收到的数据应该是“\r\n任务1:\r\n”和“\r\n任务2:\r\n”紧接在一起的,也就是:
{
任务1:
任务2:
First task Running!
Second task Running!
}
然而现象是:
{
任务1:
First task Running!
任务2:
Second task Running!
}
为什么会这样呢,为什么第一轮和预想的一样,第二轮开始就成了这样了呢,是否是我程序分析得不对?
困扰多时,还望原子哥和左前辈还有各位大牛解我之惑,感激之至。
|
最佳答案
查看完整内容[请看2#楼]
非常感谢@yanzhuangsongqi 所提到的1S延时,一语点醒梦中人,关键就在于这个1S延时当中。
问题基本明朗了,我原文中分析错误的地方在于:
接下来按顺序执行到179行,发送信号量
紧接着任务2中的194行等待信号量已经等待完毕,接着执行
179行发送完信号量后,根据OSSemPost()函数的描述,“如果有一个或多个任务在等待这个信号量,则优先级最高的任务将获得这个信号量,然后由调度器来判定刚获得信号量的任务是否为系统中 ...
|