完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
FreeRTOS:最近在学习freeRTOS操作系统。使用freeRTOS V6.0.5版和cotexM0内核的芯片。系统中创建了两个任务:点灯(低优先级)、串口通信(高优先级),点灯任务还要完成喂狗功能;此外还创建了一个信号量。vTaskdDelay()是在点灯任务里面调用的;xSemaphoreTake()在串口通信任务函数里面调用来获取信号量,在串口中断中判断收到完整的帧后就使用xSemaphoreGiveFromISR()发送信号量,判断信号量发送成功后进行上下文切换退出中断函数。在仿真调试时发现退出中断函数后系统已经切换到串口通信任务中,但是接下来串口通信任务和点灯任务的任务函数就再也执行不到,导致看门狗复位。vtaskdelay()和xSemaphoreTake()单独使用的时候系统都能正常运行,当他们同时使用时系统就会死机,请问各位高手知不知道这是什么问题?
|
|
相关推荐
4个回答
|
|
能給局部代碼嗎? 看的不明白你要表達的意思
|
|
|
|
int main( void )
{ __disable_irq(); Sys_Init(); __enable_irq(); xTaskCreate((pdTASK_CODE) Led_task,(signed portCHAR *)"LEDRUN",configMINIMAL_STACK_SIZE,NULL,tskIDLE_PRIORITY+1,NULL); vSemaphoreCreateBinary(xBinarySemaphoreUART); if(NULL != xBinarySemaphoreUART) { xTaskCreate((pdTASK_CODE) UART_task,(signed portCHAR *)"uart",configMINIMAL_STACK_SIZE,NULL,tskIDLE_PRIORITY+2,NULL); } vTaskStartScheduler(); /* Start the scheduler. */ return 0; } void Led_task(void) { static int i=0; for(;;) { switch(i) { case(0): GPIO->B &=~LEDRUN_Pin; i=1; break; case(1): GPIO->B |= LEDRUN_Pin; i=0; break; default: break; } fnWDT_Restart(); vTaskDelay(100/portTICK_RATE_MS); } } void UART_task(void) { for(;;) { xSemaphoreTake( xBinarySemaphoreUART, portMAX_DELAY); if(1 == flag485) { flag485 = 0; Downlink_task(); } } } void UART0_HANDLER(void) { ulong32 status; uchar8 temp; portCHAR xSwitchRequired; static portBASE_TYPE xHigherPriorityTaskWoken485; xSwitchRequired = 1; status = UART0->STA; /* UART error irq */ if((UART0->CTRL & 0x8) && (status & 0x3c)) { UART0->STA = status; } /* receive data complete irq */ if((UART0->CTRL & 0x4) && (status & 0x1)) { temp = UART0->RXD; temp = uart_rcv(temp,&u_485); if(C_Finish == temp) { flag485 = 1; xHigherPriorityTaskWoken485 = pdFALSE; /* 'Give' the semaphore to unblock the task. */ xSemaphoreGiveFromISR( xBinarySemaphoreUART, &xHigherPriorityTaskWoken485); if(pdTRUE == xHigherPriorityTaskWoken485 ) { /* 强制进行一次任务切换,以确保中断直接返回到解除阻塞的任务(优先级更高)。 */ portEND_SWITCHING_ISR( xSwitchRequired ); ///*******test*******/// ///*******test*******/// } } UART0->STA = 0x1;// clear receive IF } /* transmit data complete irq */ if((UART0->CTRL & 0x2) && (status & 0x2)) { UART0->STA = 0x2; if(u_485.tx_ptr UART0->TXD=u_485.buf[u_485.tx_ptr++]; } else { init_uart_para(30,50,&u_485); } } UART0->STA = status; return; } |
|
|
|
部分代码如上,当向串口发送帧消息时系统就会死机,看门狗复位。
|
|
|
|
你好,代码你看了吗?可以看出哪边有问题吗?
|
|
|
|
只有小组成员才能发言,加入小组>>
674 浏览 0 评论
1098 浏览 1 评论
2463 浏览 5 评论
2794 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2632 浏览 6 评论
使用eim外接fpga可是端口一点反应都没有有没有大哥指点一下啊
644浏览 9评论
640浏览 7评论
请教大神怎样去解决iMX6Q在linux3.0.35内核上做AP失败的问题呢
771浏览 6评论
615浏览 5评论
659浏览 5评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-14 12:21 , Processed in 0.846494 second(s), Total 52, Slave 44 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号