硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2681|回复: 5
收起左侧

[FreeRTOS] 如何使用一个定时器 发起一个信号去实现 阻塞一个任务

[复制链接]

5

主题

10

回帖

25

积分

新手上路

积分
25
发表于 2019-3-9 11:50:40 | 显示全部楼层 |阅读模式
我想在task 中take 信号量,另外 用个timer 定时10ms  give 一下信号,
但是信号一直give 失败, task 里面也一直 take 不到信号

  1. #include "FreeRTOS.h"
  2. #include "semphr.h"
  3. #include "projdefs.h"
  4. #include "timers.h"

  5. static TaskHandle_t task_handles;
  6. TimerHandle_t timer_hadles;
  7. SemaphoreHandle_t run_semaphore;
  8. static void timer_generate(void)
  9. {
  10. //10ms 跑一次 给出一下信号
  11. if(xSemaphoreGive( run_semaphore ) != pdTRUE)
  12. {
  13. OUT_LOG_I("GIVE NG");
  14. }
  15. }
  16. void task(void)
  17. {
  18. // 创建信息量
  19. run_semaphore = xSemaphoreCreateBinary();

  20. if( run_semaphore != NULL )
  21. {
  22. OUT_LOG_I("run_semaphore ok");
  23. }

  24. for (;;)
  25. {
  26. //等待信号量到来
  27. if( xSemaphoreTake( run_semaphore, portMAX_DELAY ) == pdTRUE )
  28. {
  29. Msg_Process();
  30. }
  31. else
  32. {
  33. OUT_LOG_I("=====semaphore not get====");
  34. }
  35. }
  36. }

  37. void task_create(void)
  38. {
  39. OUT_LOG_I("task create");
  40. xTaskCreate(task,"task",640,NULL,1,&task_handles);
  41. //每10ms产生一个信号量
  42. timer_hadles = xTimerCreate("timer", TIMER_BASE/portTICK_PERIOD_MS, pdTRUE, NULL, timer_generate);
  43. xTimerStart(timer_hadles, 0);
  44. }
复制代码


后面我使用 tasknotify 的函数去实现,但是 也是没反应
在 config  中 开了#define configUSE_TASK_NOTIFICATIONS 1

但是就是一直阻塞没有进入Msg_Process();
  1. #include "FreeRTOS.h"
  2. #include "semphr.h"
  3. #include "projdefs.h"
  4. #include "timers.h"
  5. #include "task.h"

  6. static TaskHandle_t     task_handles;
  7. TimerHandle_t   timer_hadles;


  8. static void timer_generate(void)
  9. {
  10.       //10ms
  11.       xTaskNotifyGive( task_handles );
  12. }

  13. void task(void)
  14. {
  15.        for (;;)
  16.        {
  17.            //阻塞等待 notify
  18.             ulTaskNotifyTake( pdTRUE, portMAX_DELAY );
  19.            Msg_Process();
  20.         }
  21. }


  22. void task_create(void)
  23. {
  24.          OUT_LOG_I("task create");
  25.          xTaskCreate(task,"task",640,NULL,1,&task_handles);
  26.          //每10ms notify 一下
  27.         timer_hadles = xTimerCreate("timer", TIMER_BASE/portTICK_PERIOD_MS, pdTRUE, NULL, timer_generate);
  28.          xTimerStart(timer_hadles, 0);
  29. }

复制代码

请问如何实现 这个要求呢?

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106726
QQ
发表于 2019-3-9 12:09:39 | 显示全部楼层
程序看着没问题,确定下你的函数timer_generate被调用了没。
回复

使用道具 举报

5

主题

10

回帖

25

积分

新手上路

积分
25
 楼主| 发表于 2019-3-9 12:48:40 | 显示全部楼层
eric2013 发表于 2019-3-9 12:09
程序看着没问题,确定下你的函数timer_generate被调用了没。

谢谢!  我加个打印试试!
是信号那个吗?  还是 tasknotify 那种方式?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106726
QQ
发表于 2019-3-9 12:52:08 | 显示全部楼层
mksu 发表于 2019-3-9 12:48
谢谢!  我加个打印试试!
是信号那个吗?  还是 tasknotify 那种方式?

发送和接收里面都加个打印。
回复

使用道具 举报

5

主题

10

回帖

25

积分

新手上路

积分
25
 楼主| 发表于 2019-3-10 10:42:39 | 显示全部楼层
eric2013 发表于 2019-3-9 12:52
发送和接收里面都加个打印。

谢谢! 使用window 下port 的例子可以, 看来要回去看看在实际硬件上的那个哪里有问题了!!!


2019-03-10_104131.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106726
QQ
发表于 2019-3-10 11:04:46 | 显示全部楼层
mksu 发表于 2019-3-10 10:42
谢谢! 使用window 下port 的例子可以, 看来要回去看看在实际硬件上的那个哪里有问题了!!!

好的,后面有什么问题再进一步交流
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-2 07:41 , Processed in 0.183740 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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