OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4420|回复: 8

CMSIS-RTOS 任务调度

[复制链接]

3

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2015-1-6
在线时间
16 小时
发表于 2016-11-1 18:29:27 | 显示全部楼层 |阅读模式
1金钱
我使用CMSIS创建三个线程分别输出字符a,b,c,代码如下所示:
[mw_shl_code=applescript,true]#include "cmsis_os.h"
#include "stdio.h"

//定义线程的函数原型
void Thread_Print(void const *arg)
{
        uint32_t i;
        for(i=i;i<260;i++){
                printf("%s",(char *)arg);
        }
}///结束

osThreadDef(Thread_Print,osPriorityNormal,3,0);

int main(void)            
{
        osKernelInitialize(); //初始化CMSIS-RTOS内核
        stdout_init();        //重定向printf函数到串口
        osThreadCreate(osThread(Thread_Print),"a"); //创建线程输出a
        osThreadCreate(osThread(Thread_Print),"b"); //创建线程输出b
        osThreadCreate(osThread(Thread_Print),"c"); //创建线程输出c
        osKernelStart();      //启动CMSIS-RTOS内核,开始线程调度
}[/mw_shl_code]


       


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2015-1-6
在线时间
16 小时
 楼主| 发表于 2016-11-1 18:31:35 | 显示全部楼层
出现的结果是:

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbcbc




请问,为什么第一个线程运行时,也就是输出a的线程会运行一段时间之后,才会出现三个线程交替运行??
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2016-11-1 19:06:41 | 显示全部楼层
帮顶
回复

使用道具 举报

3

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2015-1-6
在线时间
16 小时
 楼主| 发表于 2016-11-1 19:58:42 | 显示全部楼层
顶,顶,顶!
回复

使用道具 举报

11

主题

1044

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3720
金钱
3720
注册时间
2011-5-23
在线时间
2012 小时
发表于 2016-11-1 20:06:53 | 显示全部楼层
任务没有主动出让CPU
线程没有定义优先级和时间片的差异,所以他们执行的次序是末定义的。
RT-Thread RTOS 音频,WIFI,蓝牙
回复

使用道具 举报

3

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2015-1-6
在线时间
16 小时
 楼主| 发表于 2016-11-1 20:39:26 | 显示全部楼层
aozima 发表于 2016-11-1 20:06
任务没有主动出让CPU
线程没有定义优先级和时间片的差异,所以他们执行的次序是末定义的。

谢谢您的回复。
的确是没有主动让出CPU,如果我使用osYield()来手动让出CPU是不会出现这个现象的。但是我不手动让出CPU是什么原因导致这个现象呢?
这个三个线程的优先级是osPriorityNormal,在使用osThreadDef时确定了。如果我第一个创建输出为b的线程,那么会一直输出同样个数的b,然后才会三个线程同时运行。所以我认为应该不是线程次序没有定义引起的。
时间片的差异?我不太懂,能否赐教?
回复

使用道具 举报

11

主题

1044

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3720
金钱
3720
注册时间
2011-5-23
在线时间
2012 小时
发表于 2016-11-1 21:09:42 | 显示全部楼层
没有什么原因呀,这就是正常现象。
即使打出 aaabbbbbccccabbacccbb 也是正常的。
只要最终总数是对的就是对的。

你同时打开A网站和B网站,你还能明确知道哪个先打开么?
即使某段时间内是不变的,但你不能确认也不能保证。
RT-Thread RTOS 音频,WIFI,蓝牙
回复

使用道具 举报

3

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2015-1-6
在线时间
16 小时
 楼主| 发表于 2016-11-1 21:28:33 | 显示全部楼层
aozima 发表于 2016-11-1 21:09
没有什么原因呀,这就是正常现象。
即使打出 aaabbbbbccccabbacccbb 也是正常的。
只要最终总数是对的就 ...

如果是写上位机多线程的应用,出现这个现象可以这么解释,因为在上位机中线程的启动时刻是无法确定的,所以说顺序是不确定的。而在这个程序中,线程的启动时刻是确定的,所以每次打印的数据应该是一样的,我又做了一个实验,创建五个线程,也是同样的现象,第一个线程运行一段时间后才会五个线程交替运行。现象如下所示:
2016-11-01_212837.png
而且前面的a的个数和三个线程的个数一样,应该不是巧合。应该和CMSIS-RTOS中系统有关。
回复

使用道具 举报

3

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2015-1-6
在线时间
16 小时
 楼主| 发表于 2016-11-3 09:56:51 来自手机 | 显示全部楼层
我觉得,当有多个线程需要调度的时候,一个线程会永远先执行5ms,然后接下来才会真正的任务调度??
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-24 21:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表