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

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

[复制链接]
moyanming2013 发布时间:2015-5-28 16:17
重要的话一般要说3遍。% x4 l9 u5 y4 [1 f3 m. y
有这么一个帖子:
, |7 X# w; F$ ^" B3 Ghttps://www.stmcu.org.cn/module/forum/thread-601766-1-1.html
' _4 H% t9 N6 c0 w6 R% I看似小问题,但对我也是收获颇多,此前还不知道main可以作为任务函数,但通过讨论、学习知道了。
# d6 }0 z7 w6 x, Y2 R但“安”版主,一直还在纠结、强调一个main退出的问题,请“安”版主仔细查阅我对此的回复:贴中#18和#20。
, e3 W. c+ k9 t( ^0 k5 y" s$ C8 X首先我对这些问题的学习也使自己得到了更多的认识,如果“安”能够仔细阅读#18,怎么还会有此前的错误的认识呢?
0 I2 i( j& {! }* J3 \0 _显然是没有看我的回复,并没有在我的回复基础上进一步讨论问题,而是还纠结在原来错误的问题上不放。我有问题你可以回复咱们再进一步讨论、相互学习。
- I  k8 y0 c3 s+ \1 j你作为版主,怎么能任意无理无据的把错误的认识误导众人呢?怎么能不仔细查阅会员的回复呢?
: Z" G; k" o2 x: Z9 Q3 y9 Y" \. s你作为版主更应该谨言慎行才是!
. _. N- I& I7 K0 i2 @8 N5 @* M“安”,你最后回答别人的问题是2014年10月15日,但答应了别人给资料而并没有给(或者你私下给了,给我说声我在这里给你正身):
; z  t4 ]6 o" [: B% D7 [% s QQ截图20150528161023.jpg ( ?7 x5 d/ r2 l# }7 G

, _) \( t& i5 e9 h9 a每个人的知识总是有限的,三人行必有我师。但不能把自己不知道,或者不知道自己不知道(无知时更需要谨言慎行)误导别人,不能说了不做,更不能随意的封杀别人,否则怎么当的版主呢?0 u  c! X# d+ b* G1 X
6 I/ S) Z) {  H" f

+ G0 \0 m/ V% \5 ?7 S
赞 收藏 评论25 发布时间:2015-5-28 16:17

举报

25个回答
moyanming2013 回答时间:2015-5-28 20:54:50
安 发表于 2015-5-28 20:40
9 p& t) b& l: K/ ^4 H' G- S' ?) c& k加了也是一样,你可以单步运行测试。他并不是在跳出导致的,是在删除空闲任务导致的。
! p* r( x. y! T很多例程都没有while ...
  1. int main(void)% V  H0 A' z7 C6 O; ?2 v$ i" v& _
  2. {
    # s  j, ]3 K2 G" D+ l& ]# X
  3.   /* STM32F4xx HAL library initialization:
    " T; K& {' v- e3 x+ ]
  4.        - Configure the Flash prefetch, instruction and Data caches) J9 t- N# T2 ^
  5.        - Configure the Systick to generate an interrupt each 1 msec6 w6 @$ G/ C4 F& d
  6.        - Set NVIC Group Priority to 4- X$ Z% y" {! W' X) n- E+ j
  7.        - Global MSP (MCU Support Package) initialization5 ?/ Q) {* x# r# j/ T: P
  8.      */* w, H/ X/ e2 I; y1 r7 {/ l+ ^
  9.   HAL_Init();  - W' n2 K0 R. @, v0 q( t8 y
  10.   
    ' O$ Z5 u% b: x
  11.   /* Configure the system clock to have a system clock = 180 Mhz */
    4 a/ d7 x3 B) N' S
  12.   SystemClock_Config();9 j# ?: \; A& \5 e5 y, G& |7 x
  13.   
    $ ^4 R! l* f' j$ n! X: e  B, r$ Z
  14.   /* Initialize LEDs */
    ! ?0 R; L  i  B
  15.   BSP_LED_Init(LED1);$ C1 |! ?5 Q% p; z8 F( {
  16.   BSP_LED_Init(LED2);
    4 W  Q- B. I1 h
  17.         $ i% z- G" [) w5 N& p
  18.         UART_Config();0 u% _4 C' \2 N9 _& {& D! B
  19.   + a! k) s1 y9 k  K$ t# g( X0 r, K
  20.   /* Thread 1 definition */
    ! D$ {" [& D6 R* z6 {4 Q
  21.   osThreadDef(Thread1, LED_Thread1, osPriorityNormal, 0, configMINIMAL_STACK_SIZE);
    9 y: L8 y5 P) g- x
  22.   
    * ?0 v- Z' K) ?2 R: _. x( m
  23.    /*  Thread 2 definition */
    + ?4 M( }; h: n% x# y
  24.   osThreadDef(Thread2, LED_Thread2, osPriorityNormal, 0, configMINIMAL_STACK_SIZE);7 ?6 j/ Y5 M; G( [
  25.   3 U( O9 S( h% Q7 d+ P
  26.   /* Start thread 1 */
      M7 \# z$ }" Z. K# K
  27.   LEDThread1Handle = osThreadCreate (osThread(Thread1), NULL);
    * S; O* @8 H0 {8 P- t7 @( i
  28.   / R. c: z( R" M  \; x
  29.   /* Start thread 2 */
    8 \0 R3 V0 ]! i  W/ i2 E
  30.   LEDThread2Handle = osThreadCreate (osThread(Thread2), NULL);
    7 x- I6 y$ X# L! c
  31.   4 G( T8 {6 [- c
  32.   /* Start scheduler    */
    $ |1 s( f# G1 Z
  33.   osKernelStart (NULL, NULL);0 h$ H- h6 D2 F. u* [

  34. ( L5 ^8 r5 k; D2 \5 _
  35.   /* We should never get here as control is now taken by the scheduler */
    3 U% Z- U0 H$ h9 t1 L' x9 G" ]
  36.   for(;;);
    ; Y5 i8 P1 i2 b1 n& C: l" B

  37. ! J* G7 d6 `2 a8 A9 P
  38. }
    4 q1 z) h/ b) _/ z
复制代码

1 _2 D2 M1 U+ P上述是Cube中的一段代码,可以看到main虽然需要一个int返回值,但实际是没有返回值。你那边警告可能是由于你的编译器设置警告值的关系。我这边没有关于main返回值给出的警告,即使你有了警告,添加一个return 0;试试。. @1 k. h+ S; f* c
如果你单步是由于删除空闲任务导致的,那么只能说明你用的UC/OS太弱了吧?删除自己的任务还会出错?或者UC/OS根本没有提供删除任务的功能呢?还是由于堆或栈上出现的问题呢?我觉得你可以在调试的更加详细一些,看看到底是出错在什么地方。7 u( C' ~+ E+ u& X% N- X$ W8 o
moyanming2013 回答时间:2015-5-28 20:31:23
安 发表于 2015-5-28 19:04
8 R: x$ @# i3 I0 Q  ?9 X, v我只做交流,不作为参考。如下:  G( E# X8 w# p
其他的系统,是在osstart中开启了任务执行,如果没有任务,比如建立一个返 ...
. W$ g# p5 L9 O" O3 z4 X& k2 o# u
空闲任务是一个默认添加的优先级最低的任务(在启动第一个任务时会自动创建---如果你设置了自动创建该任务时),这个任务不是必须的,一般也称为idle任务。8 J( O' v4 V( z5 R$ Q: j+ ]
这个任务可以作为CPU记录、时间记录和最重要的--低功耗模式时进入休眠状态(WFE、WFI)。0 d9 [9 N0 D% Q3 W6 M0 B
如果不需要,可以不添加idle任务。也就是说RTOS可以没有空闲任务,这个任务是否存在完全取决于程序员如何配置。7 g" T4 |% @0 j7 ?
在没有自己的用户任务时,你又把idle任务的死循环去掉了,你得到的结论是“ST会进入错误中断”,这是由于OSStart()返回,导致main函数返回了,又返回到复位向量中,此时PC已经没有值了,系统终止运行。9 W6 C" U$ a( G7 r# A+ X: |
如果此时你在main 的最后添加一个while死循环,最好别让系统把这个死循环优化掉,否则看不到效果,此时你再次测试会发现系统停在这个死循环中,而不是你看到的“ST会进入错误中断”。这时你就可以看到为什么往往在main最后添加一个死循环,就是让你测试至少停留在自己的用户程序,而不是让系统跑到异常向量中且系统终止了还。
! u: T' G2 T4 V9 ~5 X8 X
moyanming2013 回答时间:2015-5-28 18:13:06
安 发表于 2015-5-28 17:48
* f; F  p: v3 Y1、楼主说的这个问题,时间太长想不起来当时情况。我隐约记得在论坛中探讨过关于这个驱动,只是找到几个简 ...

; \' N; u: F: ~& R- J1.那个问题是我从你空间得知的,只是感觉为什么没下文了。所以在质疑你为什么说到不去做到。$ X# J( D! v" @6 E- t# Y6 [
2.我没有说你封杀过任何人。只是在强调可能性。, U: @; R/ V0 b7 x+ I+ I$ D
3.那么问题来了,在你错误的认识下(任何人都会有错误的认识,关键是要去学习、去了解)并你不去了解、学习,你怎么知道哪个是好贴?哪个该加精?是不是过于武断了些呢?" L- I8 E' Q1 P7 {% G
9 ^$ r+ I! y* O+ [" H
每个人当然是各抒己见,但错误的认识要知道并纠正,你作为版主更不能把错误的认识误导别人。
% j9 N4 p! V, w- O7 F* r: o/ j请看仔细查看:
- z! W0 {- j1 Y5 b3 Phttps://www.stmcu.org.cn/module/forum/thread-601766-1-1.html3 S8 ]: B. a6 M) J
中的#18和#20.
netlhx 回答时间:2015-5-28 16:36:16
贴子是我发的,感谢各位的热情讨论,认识也许有偏差,不必过于计较啦
废鱼 回答时间:2015-5-28 16:59:06
netlhx 发表于 2015-5-28 16:36
7 D/ E' t7 V: k, b/ U0 l; z# x3 ~贴子是我发的,感谢各位的热情讨论,认识也许有偏差,不必过于计较啦
' @& S! V9 P! \% `+ j- i+ K
楼主对于技术的热衷是对的,如果一个搞技术的不去正确的修正别人的错误,那么对于书写程序的严谨性可想而知。我们发现错误,并去修正是正确的做法。对于探讨我们各抒己见。
废鱼 回答时间:2015-5-28 17:48:17
1、楼主说的这个问题,时间太长想不起来当时情况。我隐约记得在论坛中探讨过关于这个驱动,只是找到几个简单的文档,没有找到驱动。7 Q2 w( U0 [1 u: @0 w1 a4 y
2、我没有封杀过任何人,也不会那样做,我的原则是做事先做人,任何人都可以质疑我。
; {  s* L3 E/ e) v" e7 ~0 \3、我知道的我会说。不知道的我不回复,或者帮顶一下帖子。对于好帖,我也会给予加精、推荐。: X) z( V4 j$ V9 g" [
moyanming2013 回答时间:2015-5-28 18:18:08
netlhx 发表于 2015-5-28 16:361 b) r8 l  |! N! a' [  p
贴子是我发的,感谢各位的热情讨论,认识也许有偏差,不必过于计较啦

, M8 X8 p; g6 C# m0 K8 Rmain函数作为任务函数确实是可行的,RTX就可以这么做,我看了其它3款RTOS,貌似也只有FreeRTOS有这方面的配置选项,但如果FreeRTOS要实现main作为任务函数,则还需要做额外的配置估计是。所以netlhx看到的FreeRTOS即使打开了配置也不能执行。
4 K6 f- H& T# F" SRTX是MDK-ARM原生的,故在《The Definitive Guide to Arm Cortex-M3 and Cortex-M4 Processors》中给出了main作为任务函数的例子。9 C' }5 B' p% ]% u
我想把main作为任务函数的好处可能是想节省一个任务的资源开销吧,其它感觉不到优势在何处呢?
废鱼 回答时间:2015-5-28 19:04:04
我只做交流,不作为参考。如下:
; E" w1 q4 ?% t9 T3 n" f其他的系统,是在osstart中开启了任务执行,如果没有任务,比如建立一个返回任务。他会进入空闲任务。可以参考ucos,空闲任务是一个for(;;)死循环。这里,我也测试去掉死循环,ST会进入错误中断。) @6 e9 v6 M8 `* ~0 i: t
其他的系统可以理解为肯定会运行一个空闲任务,根本走不下去,后面添加代码可有可无。
废鱼 回答时间:2015-5-28 20:40:36
加了也是一样,你可以单步运行测试。他并不是在跳出导致的,是在删除空闲任务导致的。# s& v) _0 z& z' n% e% e: H& F. x
很多例程都没有while,用来测试中断,但是这样运行也没有问题。按照ST的main需要的是一个int型,也就是必须有返回值。如果前面加了while,这里会有警告,返回值不能执行。
废鱼 回答时间:2015-5-28 20:59:26
KEIL就是会报错。加return是警告。9 L, L( N% m2 Y& |0 W& ~6 O; c$ n
UCOS是判断是否存在空闲任务,他会自动去删除任务,以免浪费资源。
moyanming2013 回答时间:2015-5-28 21:09:19
安 发表于 2015-5-28 20:59  ?" B/ e$ N4 j- V7 V1 ~
KEIL就是会报错。加return是警告。
  o5 \0 }8 _8 `UCOS是判断是否存在空闲任务,他会自动去删除任务,以免浪费资源。 ...

0 P+ M% l- |' L' i% p你不是说有警告吗?哪里又出现报错了??
/ t1 S' N5 v( A5 L+ t  l我是用MKD-ARM v5.13,原始CUBE中的FreeRTOS工程,没有任何问题。4 n2 ~, Y% m+ O: c2 w; v4 F
你报错的话就要自己看看哪里配置有问题?
; S$ O( A2 V6 R$ f; E既然UC/OS自动删除任务,那么就不应该在删除任务时程序挂掉,否则还是你自己移植时出现了问题?!
废鱼 回答时间:2015-5-28 21:50:02
没有return报错,while后有报警。
moyanming2013 回答时间:2015-5-28 21:59:47
安 发表于 2015-5-28 21:508 M; S: G5 @! V$ `' C* X
没有return报错,while后有报警。

2 `5 ?  Y! Z% H" l# r你为什么就不能仔细看别人的回复呢???
% {" t( O) g3 C7 N  n; X#10里关于报警已经说的很清楚了!!!% z' b) b: k2 Z3 }, C. K
QQ截图20150528215831.jpg
/ w0 W6 I& C5 B9 l7 W3 a
你好我好大家好! 回答时间:2015-5-29 00:18:10
                              
12下一页
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版