workqueue,rt_workqueue_dowork多次为何回调函数只执行一次

发表在 Others2020-3-26 10:10 [复制链接] 2 49

本帖最后由 aozima 于 2020-4-2 09:23 编辑 2 E" |; A1 Z; _+ G8 ]/ t; ]

5 x  ~' U5 c5 {, ~$ d/ Z2 w将博客https://blog.csdn.net/u012220052/article/details/96440852
8 D0 {; J0 O% _$ s8 z/ h" M中的代码复制到自己代码中5 y' R$ Q0 J0 ^- D: \7 v
  1. #include <ipc/workqueue.h>
    5 Y* s8 J" H7 w( d& u! \
  2. 3 z* i7 P% _8 P7 [5 D9 H  B
  3. //struct rt_workqueue *rt_workqueue_create(const char *name, rt_uint16_t stack_size, rt_uint8_t priority);
    : w$ f; Y9 J3 i8 B& h1 ]
  4. 0 A5 k/ V. S6 B' Y5 k& M# D: i

  5. " D/ A6 @5 L: O7 J8 F0 |1 e" t
  6. struct rt_workqueue *wq = RT_NULL;8 M6 u& e2 P3 F: Z
  7. struct rt_work work;7 B2 Y) C  f0 P& U8 l
  8. int work_data = 0xaa;$ e# @! |$ `, e$ ]4 O7 e

  9. & o' W7 L% O8 g& {& Q0 i  l3 t
  10. //回调函数。系统空闲时就会执行,只会执行一次,允许delay。  |* Z- E5 m* Y2 b9 Q: z4 S! s& F
  11. void work_func(struct rt_work *work, void *param)- S0 ?$ L5 F- B6 X9 Y
  12. {
    3 r- B* c5 \5 e. b
  13.     rt_kprintf("hello wq! param : %#x, tick : %ld\n", *(int *)param, rt_tick_get());
    ! y, [  n' H- L4 N" A9 W0 G
  14. }
      s) M# L8 g  b' w5 G0 X

  15. ! N5 U- n0 I8 G7 z* i
  16. //在建立中中断设备册时调用了一次: `: z- x0 |" ?- b( g7 H' n4 l
  17. int workqueue_init(void)
    ( J* X* i& `% G# r! \3 ~
  18. {    + U, z$ U. S: ^( n$ _! X8 g
  19.     wq = rt_workqueue_create("my_wq", 256, 15);        //创建workqueue,256为线程的stack size,15为线程的优先级。
    + e0 k) p1 h9 z
  20.     if (wq == RT_NULL)
    ) m$ l) c  ]! j# G: g* o
  21.         goto ERR;$ J: ^" h- a- ?1 D; s, H

  22. $ f8 e* O" V: L7 h5 W* d5 a
  23.     rt_work_init(&work, work_func, &work_data);        //初始化work,绑定回调函数。
    & x; p$ p/ F% ^' M
  24. * n& [/ a& ^) P9 A- L
  25.     rt_kprintf("dowork tick : %ld\n", rt_tick_get());
    # O0 c- K8 {8 Z( o: f+ E. q' H
  26. }
    2 [$ _. k$ x) d: |
  27. //中断回调函数
    0 I- c# i/ Z9 r2 x$ Y  x/ M# H5 B! _
  28. void exit_irq_callback(void)8 p- N! X5 f6 j/ C7 R* f
  29. {
    ) i: I8 \( @4 }( L1 b
  30.      rt_workqueue_dowork(wq, &work);        //排队,系统空闲时调用work的回调函数。一般放到中断函数中。5 U% o; l# f) M' Q$ J

  31. " r( @8 A/ |$ y& y: K6 B6 y
  32. * f; P% L" n9 x9 C
  33. }
复制代码

( q/ s4 D$ U" ?. U! Z
- v* `, c7 K$ a# ~: q- Z2 K2 }/ C& X2 {$ n/ j
' j& z; @' h$ t& b8 g
在运行时发现,第一次发生中断会运行一次rt_workqueue_dowork,然后系统回调用工作队列回调函数work_func。再次发生中断时,会再次调动rt_workqueue_dowork,但work_func不再执行了。调试发现_workqueue_submit_work中queue->work_current = work,返回了RT_EBUSY
( n' T1 z4 K) Z, i! @请问怎样才能每调用一次rt_workqueue_dowork,执行一次回调函数work_func呢,我自己在回调函数中取改变work_current 的值,系统会报错。
. k& e; k7 x# J$ |: w: i
使用道具 举报 显示全部楼层 回复
最新评论 | 正序浏览
显示全部楼层 |楼层直达:
发表于 3 天前 | 显示全部楼层
有用过这个的大神吗,能答复一下吗
使用道具 举报 回复
发表于 3 天前 | 显示全部楼层
芯片是啥? 3 p3 [5 i$ V+ j# k; k
栈256是否过小?- Q1 z( I, |) l- ~
ps显示啥?my_wq线程如何?
使用道具 举报 回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  1. 1 主题
  2. 17 帖子
  3. 17 积分

Ta的主页 发消息

Archiver|手机版|小黑屋|RT-Thread开发者社区 ( 沪ICP备13014002号-1

有害信息举报电话:021-31165890 手机:18930558079

© 2006-2019 上海睿赛德电子科技有限公司

Powered by RT-Thread

快速回复 返回顶部 返回列表