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

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

[复制链接]
moyanming2013 发布时间:2015-5-28 16:17
重要的话一般要说3遍。. q6 X& S8 a5 M9 G- g
有这么一个帖子:# R$ [: i3 s3 c9 H3 J; G* W, {2 |) `
https://www.stmcu.org.cn/module/forum/thread-601766-1-1.html
( u! C# X$ i9 B7 B+ }看似小问题,但对我也是收获颇多,此前还不知道main可以作为任务函数,但通过讨论、学习知道了。
. f* Z  S' q* z" U但“安”版主,一直还在纠结、强调一个main退出的问题,请“安”版主仔细查阅我对此的回复:贴中#18和#20。2 G% m7 N; q0 J* l5 }
首先我对这些问题的学习也使自己得到了更多的认识,如果“安”能够仔细阅读#18,怎么还会有此前的错误的认识呢?: B3 w' N8 @3 C/ j9 l3 R5 f
显然是没有看我的回复,并没有在我的回复基础上进一步讨论问题,而是还纠结在原来错误的问题上不放。我有问题你可以回复咱们再进一步讨论、相互学习。! Q: M7 n# P" h4 r
你作为版主,怎么能任意无理无据的把错误的认识误导众人呢?怎么能不仔细查阅会员的回复呢?
+ Y) V1 m! F  S8 l4 \) y你作为版主更应该谨言慎行才是!
8 |. b9 p  }! U  Z" L“安”,你最后回答别人的问题是2014年10月15日,但答应了别人给资料而并没有给(或者你私下给了,给我说声我在这里给你正身):
, V  I0 Q  [& @3 n. A2 a QQ截图20150528161023.jpg
8 g3 j( x& p0 G. D' H  F/ V3 c, v# K0 m3 r# e
每个人的知识总是有限的,三人行必有我师。但不能把自己不知道,或者不知道自己不知道(无知时更需要谨言慎行)误导别人,不能说了不做,更不能随意的封杀别人,否则怎么当的版主呢?7 B  t+ c6 N+ u& X4 s! }6 c

. w; p/ j2 i! U6 c% Y( A, W
6 T; ]* Y; w( _% l$ E
赞 收藏 评论25 发布时间:2015-5-28 16:17

举报

25个回答
moyanming2013 回答时间:2015-5-28 20:54:50
安 发表于 2015-5-28 20:40
7 V5 j! H- q! l1 i; a3 p9 D加了也是一样,你可以单步运行测试。他并不是在跳出导致的,是在删除空闲任务导致的。
, F. u/ |2 U/ y很多例程都没有while ...
  1. int main(void)% `, U9 f% {5 ?! E9 _
  2. {  t0 ^' H0 e7 \) x( J: u  O
  3.   /* STM32F4xx HAL library initialization:
    5 T' k3 T2 N4 O$ l$ u
  4.        - Configure the Flash prefetch, instruction and Data caches% W; \# V- j% G1 x
  5.        - Configure the Systick to generate an interrupt each 1 msec' T* _5 [6 [( g8 Z  r/ c2 [7 O. {6 ^* O
  6.        - Set NVIC Group Priority to 4
    2 V- J/ N8 T+ o$ h1 l) \( {! A
  7.        - Global MSP (MCU Support Package) initialization$ o) k. a! r  @2 |
  8.      */  i6 a3 J8 w) Q* ~+ _2 Y/ U4 u, B& ^
  9.   HAL_Init();  8 l# ^3 ~- @# i( e
  10.   
    # k- S9 R/ Q# ?
  11.   /* Configure the system clock to have a system clock = 180 Mhz */
    * A: Q0 h& O7 X! S7 c
  12.   SystemClock_Config();  C# Q* V8 F9 H: S" h8 G
  13.   9 u6 E8 d7 Q) o/ h- x  e
  14.   /* Initialize LEDs */
    - |4 H5 m! k: A+ _/ x
  15.   BSP_LED_Init(LED1);: C' W. A6 m" r" v" t9 l6 Y0 A
  16.   BSP_LED_Init(LED2);2 V9 g3 T1 Z6 C3 s# v* S0 v
  17.         + E) |; z' C8 b( s/ g  J
  18.         UART_Config();- I& C$ L: E6 [) x4 n
  19.   4 n, B$ J# \" i8 P) [$ B; w/ ^
  20.   /* Thread 1 definition */: P/ M0 y, `5 b( h* ?8 K" l
  21.   osThreadDef(Thread1, LED_Thread1, osPriorityNormal, 0, configMINIMAL_STACK_SIZE);) v) A" D6 {$ j# s! V, T
  22.   0 n' d0 R1 A5 \" g* R1 G
  23.    /*  Thread 2 definition */
    , q* i# G& K) V
  24.   osThreadDef(Thread2, LED_Thread2, osPriorityNormal, 0, configMINIMAL_STACK_SIZE);- B. X2 L9 Y2 u) }8 O& V  S
  25.   2 ^! n) _5 p- K+ W
  26.   /* Start thread 1 */  @  v- T6 Q' R
  27.   LEDThread1Handle = osThreadCreate (osThread(Thread1), NULL);
    4 g( a/ c! ^9 o6 R9 u
  28.   
    ' ^0 I) }# _. r/ Y  o
  29.   /* Start thread 2 */( r: i, w: T: h4 F6 c6 B
  30.   LEDThread2Handle = osThreadCreate (osThread(Thread2), NULL);
    3 f( d0 E) a$ C9 T+ H8 }
  31.   6 ]" z4 D" n2 t5 `& G5 Y0 {
  32.   /* Start scheduler    */
    + ^6 J0 o4 M' X
  33.   osKernelStart (NULL, NULL);
    ' E/ u9 I  p0 L. {! Y

  34. ! \" R5 }5 l  \# J- e1 `- ^
  35.   /* We should never get here as control is now taken by the scheduler */) Q/ }$ o+ f. p9 G+ n
  36.   for(;;);
    . ?3 i2 o- |6 F" E& y
  37. 5 ?% |* o6 F9 P; \# P" }0 ^7 N$ C
  38. }
    , S( k5 E3 o* m1 m2 d- B5 ?
复制代码
( H) t) J# k/ g! |
上述是Cube中的一段代码,可以看到main虽然需要一个int返回值,但实际是没有返回值。你那边警告可能是由于你的编译器设置警告值的关系。我这边没有关于main返回值给出的警告,即使你有了警告,添加一个return 0;试试。1 _  z$ Z, B6 b2 H& q
如果你单步是由于删除空闲任务导致的,那么只能说明你用的UC/OS太弱了吧?删除自己的任务还会出错?或者UC/OS根本没有提供删除任务的功能呢?还是由于堆或栈上出现的问题呢?我觉得你可以在调试的更加详细一些,看看到底是出错在什么地方。
; O1 e) h6 p1 p" Y( G  u& D/ d
moyanming2013 回答时间:2015-5-28 20:31:23
安 发表于 2015-5-28 19:046 R, a) F/ I1 E1 `$ g
我只做交流,不作为参考。如下:
2 [$ X0 v' w# i3 B; J  [其他的系统,是在osstart中开启了任务执行,如果没有任务,比如建立一个返 ...
  q! o* D. M$ d
空闲任务是一个默认添加的优先级最低的任务(在启动第一个任务时会自动创建---如果你设置了自动创建该任务时),这个任务不是必须的,一般也称为idle任务。
* O/ H  c+ }$ n8 ^  O) p2 y) b这个任务可以作为CPU记录、时间记录和最重要的--低功耗模式时进入休眠状态(WFE、WFI)。
; |9 A3 U, e  E9 d4 L/ S如果不需要,可以不添加idle任务。也就是说RTOS可以没有空闲任务,这个任务是否存在完全取决于程序员如何配置。3 T6 W  g- ?3 C- B: ~; k* V2 o% d
在没有自己的用户任务时,你又把idle任务的死循环去掉了,你得到的结论是“ST会进入错误中断”,这是由于OSStart()返回,导致main函数返回了,又返回到复位向量中,此时PC已经没有值了,系统终止运行。
$ |0 l4 p) @8 v' H7 D如果此时你在main 的最后添加一个while死循环,最好别让系统把这个死循环优化掉,否则看不到效果,此时你再次测试会发现系统停在这个死循环中,而不是你看到的“ST会进入错误中断”。这时你就可以看到为什么往往在main最后添加一个死循环,就是让你测试至少停留在自己的用户程序,而不是让系统跑到异常向量中且系统终止了还。9 m$ o- K. c# v) w2 k2 ?
moyanming2013 回答时间:2015-5-28 18:13:06
安 发表于 2015-5-28 17:48
% S( M( e+ \% [, i2 g1、楼主说的这个问题,时间太长想不起来当时情况。我隐约记得在论坛中探讨过关于这个驱动,只是找到几个简 ...
5 D6 @+ }( i( Z
1.那个问题是我从你空间得知的,只是感觉为什么没下文了。所以在质疑你为什么说到不去做到。
+ r* z6 u" j6 X* u- h2.我没有说你封杀过任何人。只是在强调可能性。
( K1 [7 k1 U. x+ t3.那么问题来了,在你错误的认识下(任何人都会有错误的认识,关键是要去学习、去了解)并你不去了解、学习,你怎么知道哪个是好贴?哪个该加精?是不是过于武断了些呢?
* I/ _  R2 j- d
# u+ v% H/ G0 V& O7 `9 B& N每个人当然是各抒己见,但错误的认识要知道并纠正,你作为版主更不能把错误的认识误导别人。$ U7 y, D! v/ ?+ D' c
请看仔细查看:
" y5 F: P. y( ^https://www.stmcu.org.cn/module/forum/thread-601766-1-1.html
+ H5 v( c( S. P; V% {中的#18和#20.
netlhx 回答时间:2015-5-28 16:36:16
贴子是我发的,感谢各位的热情讨论,认识也许有偏差,不必过于计较啦
废鱼 回答时间:2015-5-28 16:59:06
netlhx 发表于 2015-5-28 16:36
, I" g% |9 [: H9 ^( \% p4 f/ ?5 x贴子是我发的,感谢各位的热情讨论,认识也许有偏差,不必过于计较啦

6 R+ W1 Q3 {1 W- d( t楼主对于技术的热衷是对的,如果一个搞技术的不去正确的修正别人的错误,那么对于书写程序的严谨性可想而知。我们发现错误,并去修正是正确的做法。对于探讨我们各抒己见。
废鱼 回答时间:2015-5-28 17:48:17
1、楼主说的这个问题,时间太长想不起来当时情况。我隐约记得在论坛中探讨过关于这个驱动,只是找到几个简单的文档,没有找到驱动。
6 l/ Y9 _! E* t+ x7 ?7 o5 ?$ b2、我没有封杀过任何人,也不会那样做,我的原则是做事先做人,任何人都可以质疑我。7 g" f/ h8 l- Q5 [
3、我知道的我会说。不知道的我不回复,或者帮顶一下帖子。对于好帖,我也会给予加精、推荐。
, e4 v6 Z1 W5 N( [6 {+ H
moyanming2013 回答时间:2015-5-28 18:18:08
netlhx 发表于 2015-5-28 16:36- @6 E6 Z: \( l) L, ~0 f/ z
贴子是我发的,感谢各位的热情讨论,认识也许有偏差,不必过于计较啦
5 J# ]/ H, N& G3 `$ A2 T# z/ V4 v
main函数作为任务函数确实是可行的,RTX就可以这么做,我看了其它3款RTOS,貌似也只有FreeRTOS有这方面的配置选项,但如果FreeRTOS要实现main作为任务函数,则还需要做额外的配置估计是。所以netlhx看到的FreeRTOS即使打开了配置也不能执行。5 ~1 z9 B/ N' V
RTX是MDK-ARM原生的,故在《The Definitive Guide to Arm Cortex-M3 and Cortex-M4 Processors》中给出了main作为任务函数的例子。* e# P: h" b% \/ c7 e6 P
我想把main作为任务函数的好处可能是想节省一个任务的资源开销吧,其它感觉不到优势在何处呢?
废鱼 回答时间:2015-5-28 19:04:04
我只做交流,不作为参考。如下:+ X& t: F6 @7 P. N8 j
其他的系统,是在osstart中开启了任务执行,如果没有任务,比如建立一个返回任务。他会进入空闲任务。可以参考ucos,空闲任务是一个for(;;)死循环。这里,我也测试去掉死循环,ST会进入错误中断。0 B; Z2 Z9 I! I3 ?2 c2 `- p: [7 s
其他的系统可以理解为肯定会运行一个空闲任务,根本走不下去,后面添加代码可有可无。
废鱼 回答时间:2015-5-28 20:40:36
加了也是一样,你可以单步运行测试。他并不是在跳出导致的,是在删除空闲任务导致的。
, M8 R( ~& V; ]  [5 P很多例程都没有while,用来测试中断,但是这样运行也没有问题。按照ST的main需要的是一个int型,也就是必须有返回值。如果前面加了while,这里会有警告,返回值不能执行。
废鱼 回答时间:2015-5-28 20:59:26
KEIL就是会报错。加return是警告。. V' \1 @2 S8 `& h- o5 X
UCOS是判断是否存在空闲任务,他会自动去删除任务,以免浪费资源。
moyanming2013 回答时间:2015-5-28 21:09:19
安 发表于 2015-5-28 20:59
( z/ m, C& q' M. TKEIL就是会报错。加return是警告。
2 b& H- s4 y6 Y, C- y4 T4 xUCOS是判断是否存在空闲任务,他会自动去删除任务,以免浪费资源。 ...
2 R# `# C+ D! d. k0 ^% v! o
你不是说有警告吗?哪里又出现报错了??
+ l6 M9 W$ R, a4 V我是用MKD-ARM v5.13,原始CUBE中的FreeRTOS工程,没有任何问题。# |" b3 j/ x: G7 H: Q3 x
你报错的话就要自己看看哪里配置有问题?
/ d6 s- Y- X' s1 Z& \# t既然UC/OS自动删除任务,那么就不应该在删除任务时程序挂掉,否则还是你自己移植时出现了问题?!
废鱼 回答时间:2015-5-28 21:50:02
没有return报错,while后有报警。
moyanming2013 回答时间:2015-5-28 21:59:47
安 发表于 2015-5-28 21:50
, d% u3 N+ D6 P+ x* R没有return报错,while后有报警。
1 X- z2 y) e8 b9 ~
你为什么就不能仔细看别人的回复呢???
0 k2 S$ i3 e& T) r#10里关于报警已经说的很清楚了!!!, {- p4 ~* j) x: ^
QQ截图20150528215831.jpg
$ s. M* l9 @; Z& M
你好我好大家好! 回答时间:2015-5-29 00:18:10
                              
12下一页
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版