硬汉嵌入式论坛

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

[FreeRTOS] 求助!FreeRTOS串口中断中使用计数型信号量出现问题!

[复制链接]

1

主题

28

回帖

31

积分

新手上路

积分
31
发表于 2017-10-14 15:31:32 | 显示全部楼层 |阅读模式
[blockquote]/* 初始化有 5 个可用资源,当前可用资源为 0,此时计数信号量的功能等同二值信号量 */[/blockquote][blockquote]xSemaphore = xSemaphoreCreateCounting(5, 0);[/blockquote][blockquote]
[/blockquote][blockquote]/* 创建了一个任务,里面的 while 循环是这样的 */[/blockquote][blockquote]while(1)[/blockquote][blockquote]    {        [/blockquote][blockquote]        xResult = xSemaphoreTake(xSemaphore, (TickType_t)portMAX_DELAY);[/blockquote][blockquote]        [/blockquote][blockquote]        if(xResult == pdTRUE)[/blockquote][blockquote]        {[/blockquote][blockquote]            /* 接收到同步信号 */[/blockquote][blockquote]            printf("接收到同步信号\r\n");[/blockquote][blockquote]            memset(USART2_Receive, 0, USART2_Receive_Len);[/blockquote][blockquote]            USART2_Receive_Len = 0;[/blockquote][blockquote]        }        [/blockquote][blockquote]        printf("=================================================\r\n");[/blockquote][blockquote]        printf("任务名      任务状态  优先级   剩余栈 任务序号\r\n");[/blockquote][blockquote]        vTaskList((char *)&pcWriteBuffer);[/blockquote][blockquote]        printf("%s\r\n\r\n", pcWriteBuffer);[/blockquote][blockquote]
[/blockquote][blockquote]               vTaskDelay(5000);[/blockquote][blockquote]}[/blockquote][blockquote]
[/blockquote][blockquote]/* 在串口2的接收中断中是这样的 */[/blockquote][blockquote]void USART2_IRQHandler(void)[/blockquote][blockquote]{        [/blockquote][blockquote]    BaseType_t xHigherPriorityTaskWoken = pdFALSE;[/blockquote][blockquote]    [/blockquote][blockquote]    if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)  [/blockquote][blockquote]    {[/blockquote][blockquote]        USART2_Receive[USART2_Receive_Len++] = USART_ReceiveData(USART2); // 读取接收到的数据        [/blockquote][blockquote]    } [/blockquote][blockquote]        [/blockquote][blockquote]    if(!strcmp((const char *)USART2_Receive, "printf1 runing"))[/blockquote][blockquote]    {                    [/blockquote][blockquote]        USART2_Receive[USART2_Receive_Len] = '\0';[/blockquote][blockquote]        [/blockquote][blockquote]        /* 发送同步信号 */[/blockquote][blockquote]        xSemaphoreGiveFromISR(xSemaphore, &xHigherPriorityTaskWoken);[/blockquote][blockquote]        [/blockquote][blockquote]        /* 如果 xHigherPriorityTaskWoken = pdTRUE,那么退出中断后切到当前最高优先级任务执行 */[/blockquote][blockquote]        portYIELD_FROM_ISR(xHigherPriorityTaskWoken);[/blockquote][blockquote]    }[/blockquote][blockquote]}[/blockquote][blockquote]
[/blockquote][blockquote]问题是:当我通过电脑端 串口调试助手发送之后,串口2正常接收, 当电脑端串口助手连续多次发送时(大于2次),程序就卡死了! 任务中有一个5S的延时。 我理解过程应该是, 我串口助手连续发送5次之后,计数型信号量 = 5满了, 然后任务中, 每5秒获取一次 计数型信号量,直到 减到 计数为 0。 求大神解答。实际效果, 为什么不对。。。。[/blockquote][blockquote]
[/blockquote][blockquote]
[/blockquote]
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107393
QQ
发表于 2017-10-14 15:46:28 | 显示全部楼层
先将你的函数  vTaskDelay(5000);删掉,这个函数放在任务里面没有用。函数xSemaphoreTake(xSemaphore, (TickType_t)portMAX_DELAY);已经起到延迟作用了。

另外就是你的NVIC优先级设置的多,你的串口中断优先级设置的多少以及你的FreeRTOSConfig.h文件中配置可供FreeRTOS管理的最大优先级是多少。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-29 09:37 , Processed in 0.208838 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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