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

请“安”版主仔细(仔细!仔细!)的查看我的回复

[复制链接]
moyanming2013 发布时间:2015-5-28 16:17
重要的话一般要说3遍。
有这么一个帖子:
https://www.stmcu.org.cn/module/forum/thread-601766-1-1.html
看似小问题,但对我也是收获颇多,此前还不知道main可以作为任务函数,但通过讨论、学习知道了。
但“安”版主,一直还在纠结、强调一个main退出的问题,请“安”版主仔细查阅我对此的回复:贴中#18和#20。
首先我对这些问题的学习也使自己得到了更多的认识,如果“安”能够仔细阅读#18,怎么还会有此前的错误的认识呢?
显然是没有看我的回复,并没有在我的回复基础上进一步讨论问题,而是还纠结在原来错误的问题上不放。我有问题你可以回复咱们再进一步讨论、相互学习。
你作为版主,怎么能任意无理无据的把错误的认识误导众人呢?怎么能不仔细查阅会员的回复呢?
你作为版主更应该谨言慎行才是!
“安”,你最后回答别人的问题是2014年10月15日,但答应了别人给资料而并没有给(或者你私下给了,给我说声我在这里给你正身):
QQ截图20150528161023.jpg

每个人的知识总是有限的,三人行必有我师。但不能把自己不知道,或者不知道自己不知道(无知时更需要谨言慎行)误导别人,不能说了不做,更不能随意的封杀别人,否则怎么当的版主呢?


收藏 评论25 发布时间:2015-5-28 16:17

举报

25个回答
moyanming2013 回答时间:2015-5-28 20:54:50
安 发表于 2015-5-28 20:40
加了也是一样,你可以单步运行测试。他并不是在跳出导致的,是在删除空闲任务导致的。
很多例程都没有while ...
  1. int main(void)
  2. {
  3.   /* STM32F4xx HAL library initialization:
  4.        - Configure the Flash prefetch, instruction and Data caches
  5.        - Configure the Systick to generate an interrupt each 1 msec
  6.        - Set NVIC Group Priority to 4
  7.        - Global MSP (MCU Support Package) initialization
  8.      */
  9.   HAL_Init();  
  10.   
  11.   /* Configure the system clock to have a system clock = 180 Mhz */
  12.   SystemClock_Config();
  13.   
  14.   /* Initialize LEDs */
  15.   BSP_LED_Init(LED1);
  16.   BSP_LED_Init(LED2);
  17.        
  18.         UART_Config();
  19.   
  20.   /* Thread 1 definition */
  21.   osThreadDef(Thread1, LED_Thread1, osPriorityNormal, 0, configMINIMAL_STACK_SIZE);
  22.   
  23.    /*  Thread 2 definition */
  24.   osThreadDef(Thread2, LED_Thread2, osPriorityNormal, 0, configMINIMAL_STACK_SIZE);
  25.   
  26.   /* Start thread 1 */
  27.   LEDThread1Handle = osThreadCreate (osThread(Thread1), NULL);
  28.   
  29.   /* Start thread 2 */
  30.   LEDThread2Handle = osThreadCreate (osThread(Thread2), NULL);
  31.   
  32.   /* Start scheduler    */
  33.   osKernelStart (NULL, NULL);

  34.   /* We should never get here as control is now taken by the scheduler */
  35.   for(;;);

  36. }
复制代码

上述是Cube中的一段代码,可以看到main虽然需要一个int返回值,但实际是没有返回值。你那边警告可能是由于你的编译器设置警告值的关系。我这边没有关于main返回值给出的警告,即使你有了警告,添加一个return 0;试试。
如果你单步是由于删除空闲任务导致的,那么只能说明你用的UC/OS太弱了吧?删除自己的任务还会出错?或者UC/OS根本没有提供删除任务的功能呢?还是由于堆或栈上出现的问题呢?我觉得你可以在调试的更加详细一些,看看到底是出错在什么地方。
moyanming2013 回答时间:2015-5-28 20:31:23
安 发表于 2015-5-28 19:04
我只做交流,不作为参考。如下:
其他的系统,是在osstart中开启了任务执行,如果没有任务,比如建立一个返 ...

空闲任务是一个默认添加的优先级最低的任务(在启动第一个任务时会自动创建---如果你设置了自动创建该任务时),这个任务不是必须的,一般也称为idle任务。
这个任务可以作为CPU记录、时间记录和最重要的--低功耗模式时进入休眠状态(WFE、WFI)。
如果不需要,可以不添加idle任务。也就是说RTOS可以没有空闲任务,这个任务是否存在完全取决于程序员如何配置。
在没有自己的用户任务时,你又把idle任务的死循环去掉了,你得到的结论是“ST会进入错误中断”,这是由于OSStart()返回,导致main函数返回了,又返回到复位向量中,此时PC已经没有值了,系统终止运行。
如果此时你在main 的最后添加一个while死循环,最好别让系统把这个死循环优化掉,否则看不到效果,此时你再次测试会发现系统停在这个死循环中,而不是你看到的“ST会进入错误中断”。这时你就可以看到为什么往往在main最后添加一个死循环,就是让你测试至少停留在自己的用户程序,而不是让系统跑到异常向量中且系统终止了还。
moyanming2013 回答时间:2015-5-28 18:13:06
安 发表于 2015-5-28 17:48
1、楼主说的这个问题,时间太长想不起来当时情况。我隐约记得在论坛中探讨过关于这个驱动,只是找到几个简 ...

1.那个问题是我从你空间得知的,只是感觉为什么没下文了。所以在质疑你为什么说到不去做到。
2.我没有说你封杀过任何人。只是在强调可能性。
3.那么问题来了,在你错误的认识下(任何人都会有错误的认识,关键是要去学习、去了解)并你不去了解、学习,你怎么知道哪个是好贴?哪个该加精?是不是过于武断了些呢?

每个人当然是各抒己见,但错误的认识要知道并纠正,你作为版主更不能把错误的认识误导别人。
请看仔细查看:
https://www.stmcu.org.cn/module/forum/thread-601766-1-1.html
中的#18和#20.
netlhx 回答时间:2015-5-28 16:36:16
贴子是我发的,感谢各位的热情讨论,认识也许有偏差,不必过于计较啦
废鱼 回答时间:2015-5-28 16:59:06
netlhx 发表于 2015-5-28 16:36
贴子是我发的,感谢各位的热情讨论,认识也许有偏差,不必过于计较啦

楼主对于技术的热衷是对的,如果一个搞技术的不去正确的修正别人的错误,那么对于书写程序的严谨性可想而知。我们发现错误,并去修正是正确的做法。对于探讨我们各抒己见。
废鱼 回答时间:2015-5-28 17:48:17
1、楼主说的这个问题,时间太长想不起来当时情况。我隐约记得在论坛中探讨过关于这个驱动,只是找到几个简单的文档,没有找到驱动。
2、我没有封杀过任何人,也不会那样做,我的原则是做事先做人,任何人都可以质疑我。
3、我知道的我会说。不知道的我不回复,或者帮顶一下帖子。对于好帖,我也会给予加精、推荐。
moyanming2013 回答时间:2015-5-28 18:18:08
netlhx 发表于 2015-5-28 16:36
贴子是我发的,感谢各位的热情讨论,认识也许有偏差,不必过于计较啦

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作为任务函数的好处可能是想节省一个任务的资源开销吧,其它感觉不到优势在何处呢?
废鱼 回答时间:2015-5-28 19:04:04
我只做交流,不作为参考。如下:
其他的系统,是在osstart中开启了任务执行,如果没有任务,比如建立一个返回任务。他会进入空闲任务。可以参考ucos,空闲任务是一个for(;;)死循环。这里,我也测试去掉死循环,ST会进入错误中断。
其他的系统可以理解为肯定会运行一个空闲任务,根本走不下去,后面添加代码可有可无。
废鱼 回答时间:2015-5-28 20:40:36
加了也是一样,你可以单步运行测试。他并不是在跳出导致的,是在删除空闲任务导致的。
很多例程都没有while,用来测试中断,但是这样运行也没有问题。按照ST的main需要的是一个int型,也就是必须有返回值。如果前面加了while,这里会有警告,返回值不能执行。
废鱼 回答时间:2015-5-28 20:59:26
KEIL就是会报错。加return是警告。
UCOS是判断是否存在空闲任务,他会自动去删除任务,以免浪费资源。
moyanming2013 回答时间:2015-5-28 21:09:19
安 发表于 2015-5-28 20:59
KEIL就是会报错。加return是警告。
UCOS是判断是否存在空闲任务,他会自动去删除任务,以免浪费资源。 ...

你不是说有警告吗?哪里又出现报错了??
我是用MKD-ARM v5.13,原始CUBE中的FreeRTOS工程,没有任何问题。
你报错的话就要自己看看哪里配置有问题?
既然UC/OS自动删除任务,那么就不应该在删除任务时程序挂掉,否则还是你自己移植时出现了问题?!
废鱼 回答时间:2015-5-28 21:50:02
没有return报错,while后有报警。
moyanming2013 回答时间:2015-5-28 21:59:47
安 发表于 2015-5-28 21:50
没有return报错,while后有报警。

你为什么就不能仔细看别人的回复呢???
#10里关于报警已经说的很清楚了!!!
QQ截图20150528215831.jpg
你好我好大家好! 回答时间:2015-5-29 00:18:10
                              
12下一页

所属标签

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