
重要的话一般要说3遍。 有这么一个帖子: https://www.stmcu.org.cn/module/forum/thread-601766-1-1.html 看似小问题,但对我也是收获颇多,此前还不知道main可以作为任务函数,但通过讨论、学习知道了。 但“安”版主,一直还在纠结、强调一个main退出的问题,请“安”版主仔细查阅我对此的回复:贴中#18和#20。 首先我对这些问题的学习也使自己得到了更多的认识,如果“安”能够仔细阅读#18,怎么还会有此前的错误的认识呢? 显然是没有看我的回复,并没有在我的回复基础上进一步讨论问题,而是还纠结在原来错误的问题上不放。我有问题你可以回复咱们再进一步讨论、相互学习。 你作为版主,怎么能任意无理无据的把错误的认识误导众人呢?怎么能不仔细查阅会员的回复呢? 你作为版主更应该谨言慎行才是! “安”,你最后回答别人的问题是2014年10月15日,但答应了别人给资料而并没有给(或者你私下给了,给我说声我在这里给你正身): ![]() 每个人的知识总是有限的,三人行必有我师。但不能把自己不知道,或者不知道自己不知道(无知时更需要谨言慎行)误导别人,不能说了不做,更不能随意的封杀别人,否则怎么当的版主呢? |
上述是Cube中的一段代码,可以看到main虽然需要一个int返回值,但实际是没有返回值。你那边警告可能是由于你的编译器设置警告值的关系。我这边没有关于main返回值给出的警告,即使你有了警告,添加一个return 0;试试。
如果你单步是由于删除空闲任务导致的,那么只能说明你用的UC/OS太弱了吧?删除自己的任务还会出错?或者UC/OS根本没有提供删除任务的功能呢?还是由于堆或栈上出现的问题呢?我觉得你可以在调试的更加详细一些,看看到底是出错在什么地方。
空闲任务是一个默认添加的优先级最低的任务(在启动第一个任务时会自动创建---如果你设置了自动创建该任务时),这个任务不是必须的,一般也称为idle任务。
这个任务可以作为CPU记录、时间记录和最重要的--低功耗模式时进入休眠状态(WFE、WFI)。
如果不需要,可以不添加idle任务。也就是说RTOS可以没有空闲任务,这个任务是否存在完全取决于程序员如何配置。
在没有自己的用户任务时,你又把idle任务的死循环去掉了,你得到的结论是“ST会进入错误中断”,这是由于OSStart()返回,导致main函数返回了,又返回到复位向量中,此时PC已经没有值了,系统终止运行。
如果此时你在main 的最后添加一个while死循环,最好别让系统把这个死循环优化掉,否则看不到效果,此时你再次测试会发现系统停在这个死循环中,而不是你看到的“ST会进入错误中断”。这时你就可以看到为什么往往在main最后添加一个死循环,就是让你测试至少停留在自己的用户程序,而不是让系统跑到异常向量中且系统终止了还。
1.那个问题是我从你空间得知的,只是感觉为什么没下文了。所以在质疑你为什么说到不去做到。
2.我没有说你封杀过任何人。只是在强调可能性。
3.那么问题来了,在你错误的认识下(任何人都会有错误的认识,关键是要去学习、去了解)并你不去了解、学习,你怎么知道哪个是好贴?哪个该加精?是不是过于武断了些呢?
每个人当然是各抒己见,但错误的认识要知道并纠正,你作为版主更不能把错误的认识误导别人。
请看仔细查看:
https://www.stmcu.org.cn/module/forum/thread-601766-1-1.html
中的#18和#20.
楼主对于技术的热衷是对的,如果一个搞技术的不去正确的修正别人的错误,那么对于书写程序的严谨性可想而知。我们发现错误,并去修正是正确的做法。对于探讨我们各抒己见。
2、我没有封杀过任何人,也不会那样做,我的原则是做事先做人,任何人都可以质疑我。
3、我知道的我会说。不知道的我不回复,或者帮顶一下帖子。对于好帖,我也会给予加精、推荐。
main函数作为任务函数确实是可行的,RTX就可以这么做,我看了其它3款RTOS,貌似也只有FreeRTOS有这方面的配置选项,但如果FreeRTOS要实现main作为任务函数,则还需要做额外的配置估计是。所以netlhx看到的FreeRTOS即使打开了配置也不能执行。
RTX是MDK-ARM原生的,故在《The Definitive Guide to Arm Cortex-M3 and Cortex-M4 Processors》中给出了main作为任务函数的例子。
我想把main作为任务函数的好处可能是想节省一个任务的资源开销吧,其它感觉不到优势在何处呢?
其他的系统,是在osstart中开启了任务执行,如果没有任务,比如建立一个返回任务。他会进入空闲任务。可以参考ucos,空闲任务是一个for(;;)死循环。这里,我也测试去掉死循环,ST会进入错误中断。
其他的系统可以理解为肯定会运行一个空闲任务,根本走不下去,后面添加代码可有可无。
很多例程都没有while,用来测试中断,但是这样运行也没有问题。按照ST的main需要的是一个int型,也就是必须有返回值。如果前面加了while,这里会有警告,返回值不能执行。
UCOS是判断是否存在空闲任务,他会自动去删除任务,以免浪费资源。
你不是说有警告吗?哪里又出现报错了??
我是用MKD-ARM v5.13,原始CUBE中的FreeRTOS工程,没有任何问题。
你报错的话就要自己看看哪里配置有问题?
既然UC/OS自动删除任务,那么就不应该在删除任务时程序挂掉,否则还是你自己移植时出现了问题?!
你为什么就不能仔细看别人的回复呢???
#10里关于报警已经说的很清楚了!!!