|
[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] |
|