野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 27839|回复: 4

rtthread例程信号量问题

[复制链接]
发表于 2021-6-9 13:15:15 | 显示全部楼层 |阅读模式
5火花
我按照教程里边写,发现这个问题
1、发送线程这里,如果没有这个延时        rt_thread_mdelay(100);,就会卡住,如图所示,为什么呢?这里只是让两个变量自增,应该很快,不会锁住线程啊,而且后面还有yield让出线程
  1. static void sem_send_thread_entry(void* parameter)
  2. {
  3.         while (1)
  4.         {
  5.                 rt_sem_take(test_sem,RT_WAITING_FOREVER);
  6.                 ucValue[0]++;
  7. //                rt_thread_mdelay(100);
  8.                 ucValue[1]++;
  9.                 rt_sem_release(test_sem);
  10.                 rt_thread_yield();
  11.         }
  12. }
复制代码

2、第二个问题,如果加上上面的延时,可以正常运行,我发送ucValue数组的值,发现不能连续输出,只能隔一个输出,如图所示。如果想要连续输出,得怎么改呢?
野火论坛202106091312253152..png
不胜感激


回复

使用道具 举报

 楼主| 发表于 2021-6-9 13:51:23 | 显示全部楼层
调试了一下,sem_send_thread_entry线程优先级比sem_rev_thread_entry 优先级高或者相同,则可以连续发出。否则就会出现间断
sem_send_thread_entry线程,这里进行自增
  1. static void sem_send_thread_entry(void* parameter)
  2. {
  3.         while (1)
  4.         {
  5.                 rt_sem_take(test_sem,RT_WAITING_FOREVER);
  6.                 ucValue[0]++;
  7. rt_thread_mdelay(100);
  8.                 ucValue[1]++;
  9.                 rt_sem_release(test_sem);
  10.                 rt_thread_yield();
  11.         }
  12. }
复制代码
sem_rev_thread_entry 线程,进行比较
  1. static void sem_rev_thread_entry(void* parameter)
  2. {
  3.         while (1)
  4.         {
  5.                 rt_sem_take(test_sem,RT_WAITING_FOREVER);
  6.                 if(ucValue[0] == ucValue[1])
  7.                 {
  8.                         rt_kprintf("sem ok %d = %d\n",ucValue[0],ucValue[1]);
  9.                 }
  10.                 else
  11.                 {
  12.                         rt_kprintf("fail\n");
  13.                 }
  14.                 rt_sem_release(test_sem);
  15.                 rt_thread_mdelay(100);
  16.         }
  17. }
复制代码
正常来说,自增的线程优先级高,不会被打断,这时候数据会连续增加;比较的线程优先级高,被打断,自增会有问题,出现间隔。
可是事实却正相反。

回复

使用道具 举报

 楼主| 发表于 2021-6-9 14:16:55 | 显示全部楼层
又调试了一下,send函数,如果把send线程的        rt_thread_yield  函数 改成 rt_thread_mdelay,不管优先级如何都是连续发送。这个yield和mdelay都是让出cpu,为啥结果却不一样呢,谢谢
  1. static void sem_send_thread_entry(void* parameter)
  2. {
  3.         rt_err_t uwRet = RT_ERROR;
  4.         while (1)
  5.         {
  6.                 uwRet = rt_sem_take(test_sem,RT_WAITING_FOREVER);
  7.                 if(uwRet != RT_ERROR)
  8.                 {
  9.                         rt_kprintf("send得到信号量");
  10.                 }
  11.                 ucValue[0]++;
  12.                 ucValue[1]++;
  13.                 rt_sem_release(test_sem);
  14.                 rt_thread_mdelay(100);
  15. //                rt_thread_yield();
  16.         }
  17. }
复制代码




回复

使用道具 举报

发表于 2021-6-22 11:10:21 | 显示全部楼层
有可能是bug,查到github上有主分支的修复记录,不过不知道3.1.3版本有没有修复

野火论坛202106221109257899..png
回复

使用道具 举报

 楼主| 发表于 2021-9-18 09:42:20 | 显示全部楼层
ZZZ_XXJ 发表于 2021-6-22 11:10
有可能是bug,查到github上有主分支的修复记录,不过不知道3.1.3版本有没有修复

...

这都能找到,厉害。我这个问题可能是调用串口发送导致的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-5-5 17:30 , Processed in 0.063921 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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