找回密码
 立即注册
查看: 46|回复: 2

FreeRTOS结构下测量方波信号的问题

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-04-27 17:49:08
已绑定手机

5

主题

15

回帖

131

积分

注册会员

积分
131
发表于 2025-4-15 21:43:45 | 显示全部楼层 |阅读模式
采用32G12K128 测量方波信号的频率,
裸奔的情况下,使用定时器和管脚中断就可以完成。
但在FreeRTOS的框架下面如果再突兀的使用这两个中断,
我设计的程序,FreeRTOS的任务调度会受到干扰。
程序会跑飞。请问有什么好的方案吗?
回复

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 2025-4-15 21:48:00 | 显示全部楼层
在FreeRTOS框架下测量方波信号的频率时,确实需要特别注意中断与任务调度之间的协调,以避免系统不稳定或任务调度受到干扰。以下是一些建议和方案,帮助您在FreeRTOS环境下实现方波信号的频率测量。

1. 使用FreeRTOS的中断服务例程(ISR)机制
FreeRTOS提供了专门的中断服务例程(ISR)机制,允许在中断上下文中进行任务通知或信号量的操作,从而避免直接操作任务调度器。您可以在管脚中断服务例程中使用xTaskNotifyFromISR或xSemaphoreGiveFromISR来通知任务进行处理。

示例代码:
  1. c
  2. // 定义任务句柄和信号量
  3. TaskHandlet xFrequencyTaskHandle;
  4. SemaphoreHandlet xSemaphore;
  5. // 管脚中断服务例程
  6. void GPIOISR(void) {
  7.     BaseTypet xHigherPriorityTaskWoken = pdFALSE;
  8.     xSemaphoreGiveFromISR(xSemaphore, &xHigherPriorityTaskWoken);
  9.     portYIELDFROMISR(xHigherPriorityTaskWoken);
  10. }
  11. // 频率测量任务
  12. void vFrequencyTask(void pvParameters) {
  13.     while (1) {
  14.         if (xSemaphoreTake(xSemaphore, portMAXDELAY) == pdTRUE) {
  15.             // 处理方波信号,计算频率
  16.         }
  17.     }
  18. }
  19. // 初始化函数
  20. void vInit(void) {
  21.     xSemaphore = xSemaphoreCreateBinary();
  22.     xTaskCreate(vFrequencyTask, "FrequencyTask", configMINIMALSTACKSIZE, NULL, 1, &xFrequencyTaskHandle);
  23.     // 配置管脚中断
  24. }
复制代码

2. 使用定时器中断与任务同步
在FreeRTOS中,定时器中断也可以与任务同步。您可以在定时器中断服务例程中通知任务进行处理,而不是直接在中断中处理复杂的逻辑。

示例代码:
  1. c
  2. // 定义任务句柄和信号量
  3. TaskHandlet xTimerTaskHandle;
  4. SemaphoreHandlet xTimerSemaphore;
  5. // 定时器中断服务例程
  6. void TIMERISR(void) {
  7.     BaseTypet xHigherPriorityTaskWoken = pdFALSE;
  8.     xSemaphoreGiveFromISR(xTimerSemaphore, &xHigherPriorityTaskWoken);
  9.     portYIELDFROMISR(xHigherPriorityTaskWoken);
  10. }
  11. // 定时器任务
  12. void vTimerTask(void pvParameters) {
  13.     while (1) {
  14.         if (xSemaphoreTake(xTimerSemaphore, portMAXDELAY) == pdTRUE) {
  15.             // 处理定时器中断,计算频率
  16.         }
  17.     }
  18. }
  19. // 初始化函数
  20. void vInit(void) {
  21.     xTimerSemaphore = xSemaphoreCreateBinary();
  22.     xTaskCreate(vTimerTask, "TimerTask", configMINIMALSTACKSIZE, NULL, 1, &xTimerTaskHandle);
  23.     // 配置定时器中断
  24. }
复制代码

3. 使用FreeRTOS的软件定时器
FreeRTOS提供了软件定时器功能,可以在任务上下文中处理定时事件,而不需要直接使用硬件定时器中断。您可以使用软件定时器来定期检查方波信号的状态,并计算频率。

示例代码:
  1. c
  2. // 定义软件定时器句柄
  3. TimerHandlet xFrequencyTimer;
  4. // 软件定时器回调函数
  5. void vFrequencyTimerCallback(TimerHandlet xTimer) {
  6.     // 检查方波信号状态,计算频率
  7. }
  8. // 初始化函数
  9. void vInit(void) {
  10.     xFrequencyTimer = xTimerCreate("FrequencyTimer", pdMSTOTICKS(100), pdTRUE, NULL, vFrequencyTimerCallback);
  11.     xTimerStart(xFrequencyTimer, 0);
  12. }
复制代码

4. 优化中断优先级
在FreeRTOS中,中断优先级的管理非常重要。确保您的管脚中断和定时器中断的优先级设置合理,避免中断优先级过高导致任务调度器无法正常运行。通常,建议将中断优先级设置为低于或等于configMAXSYSCALLINTERRUPTPRIORITY,以确保FreeRTOS的API可以在中断中安全调用。

5. 使用任务通知代替信号量
任务通知是FreeRTOS提供的一种轻量级同步机制,比信号量更高效。您可以在中断服务例程中使用xTaskNotifyFromISR来通知任务进行处理。

示例代码:
  1. c
  2. // 定义任务句柄
  3. TaskHandlet xFrequencyTaskHandle;
  4. // 管脚中断服务例程
  5. void GPIOISR(void) {
  6.     BaseTypet xHigherPriorityTaskWoken = pdFALSE;
  7.     xTaskNotifyFromISR(xFrequencyTaskHandle, 0, eNoAction, &xHigherPriorityTaskWoken);
  8.     portYIELDFROMISR(xHigherPriorityTaskWoken);
  9. }
  10. // 频率测量任务
  11. void vFrequencyTask(void pvParameters) {
  12.     while (1) {
  13.         ulTaskNotifyTake(pdTRUE, portMAXDELAY);
  14.         // 处理方波信号,计算频率
  15.     }
  16. }
  17. // 初始化函数
  18. void vInit(void) {
  19.     xTaskCreate(vFrequencyTask, "FrequencyTask", configMINIMALSTACKSIZE, NULL, 1, &xFrequencyTaskHandle);
  20.     // 配置管脚中断
  21. }
复制代码

总结
在FreeRTOS框架下测量方波信号的频率时,应尽量避免在中断服务例程中直接处理复杂逻辑,而是通过任务通知、信号量或软件定时器等机制与任务进行同步。合理设置中断优先级,确保任务调度器能够正常运行。通过以上方法,可以有效避免程序跑飞或任务调度受到干扰的问题。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:10
  • 最近打卡:2025-04-27 17:49:08
已绑定手机

5

主题

15

回帖

131

积分

注册会员

积分
131
发表于 2025-4-16 20:51:27 | 显示全部楼层
国芯人*** 发表于 2025-4-15 21:48
在FreeRTOS框架下测量方波信号的频率时,确实需要特别注意中断与任务调度之间的协调,以避免系统不稳定或任 ...

目前论坛上STC32G12K128的FreeRTOS 软件定时器和信号量的功能好像还没有移植好,我强行把软件定时器功能打开,运行出错。请问有没有具体的例程。
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-1 23:45 , Processed in 0.121725 second(s), 61 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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