你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

CMSIS-RTOS中碰到的一个小问题

[复制链接]
netlhx 提问时间:2015-5-26 11:29 /
使用CMSIS-RTOS做个小试验,下面是代码

QQ截图20150526112113.png

下面是结果

QQ截图20150526112126.png

CMSIS_OS.H中的定义

QQ截图20150526112715.png

问题是:为什么MAIN没有做为一个线程启动?



附:完整的MAIN函数

QQ截图20150526112351.png
<
收藏 1 评论20 发布时间:2015-5-26 11:29

举报

20个回答
回答时间:2015-5-26 17:01:37
main是可以作为任务调度,如果把main作为任务调度,那么,系统如何启动?需要修改启动文件,启动的时候调用其他的函数?
我理解就是ST的修改没有问题,freertos的意思是,可以直接在调用其他的任务以后,继续使用while(1)来运行。其他的系统,main一般都是调用一些其他的任务就结束,后面没有while(1)。
回答时间:2015-5-26 11:35:06
没用过这个系统,楼主是参考别人的还是参考例程?一般都是main里面创建其他的任务。
netlhx 回答时间:2015-5-26 11:43:40
安 发表于 2015-5-26 11:35
没用过这个系统,楼主是参考别人的还是参考例程?一般都是main里面创建其他的任务。 ...

就是想看看MAIN到底是不是做为一个任务被调度了而已;这个就是CUBE生成的,只是添加了几个变量来看MAIN的属性
stary666 回答时间:2015-5-26 12:33:17
没用过,帮顶
BBBAAA 回答时间:2015-5-26 13:22:43
没用过
moyanming2013 回答时间:2015-5-26 13:58:15
本帖最后由 moyanming2013 于 2015-5-26 14:10 编辑

本来系统就是单线运行的,这里把任务强制为是平行运行的吧。
那么main只是一个开始的入口,开始后程序便在调度器、任务、中断中来回的切换,永远无法从main中的一个函数中退出(即无法从osKernelStart()中退出,除非你的任务函数会退出且当前所有任务函数都退出了)。
这个时候的现象就是:在各任务函数中来回的切换,这个切换是由调度器实现的,调度器是一个异常中断,用户的常规中断也会打断任务的执行。总之程序无法从osKernelStat()中返回。
不是特别规范的,可以这么理解:
main()
{
...
switch(xxx){
case 1:
    func1();
    schedule();
    continue;
case 2:
    func2();
    schedule();
    continue;
......
}
while(1)
{
}
}
造成不同xxx的值是由调度器来修改的,当然RTOS更加复杂,在进入每一个func()时,都需要保存旧的并更新为新的上下文,且各个函数的任务栈都是独立的。这里只是个简单的类比。
你说main怎么会是一个任务呢(main的栈包含了所有任务的栈、且一直在运行中)?
回答时间:2015-5-26 14:43:32
main肯定不会作为一个任务被调用,他是调用别的任务的入口。要不然系统找不到main函数,根本运行不起来。
netlhx 回答时间:2015-5-26 15:37:59
安 发表于 2015-5-26 14:43
main肯定不会作为一个任务被调用,他是调用别的任务的入口。要不然系统找不到main函数,根本运行不起来。 ...

回复楼上两位:其实FREERTOS手册上都说了,MAIN可以做为一个任务参与调度,只是不知道ST对它们做了怎么的修改,我还没有搞清楚
小小笼包 回答时间:2015-5-26 20:45:34
帮顶帮顶
123下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版