OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8005|回复: 4

求助:FreeRTOS

[复制链接]

2

主题

5

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2014-7-10
在线时间
0 小时
发表于 2014-7-10 15:23:22 | 显示全部楼层 |阅读模式
5金钱

FreeRTOS:最近在学习freeRTOS操作系统。使用freeRTOS V6.0.5版和cotexM0内核的芯片。系统中创建了两个任务:点灯(低优先级)、串口通信(高优先级),点灯任务还要完成喂狗功能;此外还创建了一个信号量。vTaskdDelay()是在点灯任务里面调用的;xSemaphoreTake()在串口通信任务函数里面调用来获取信号量,在串口中断中判断收到完整的帧后就使用xSemaphoreGiveFromISR()发送信号量,判断信号量发送成功后进行上下文切换退出中断函数。在仿真调试时发现退出中断函数后系统已经切换到串口通信任务中,但是接下来串口通信任务和点灯任务的任务函数就再也执行不到,导致看门狗复位。vtaskdelay()和xSemaphoreTake()单独使用的时候系统都能正常运行,当他们同时使用时系统就会死机,请问各位高手知不知道这是什么问题?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

19

主题

234

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
362
金钱
362
注册时间
2014-7-8
在线时间
10 小时
发表于 2014-7-10 15:32:40 | 显示全部楼层
能給局部代碼嗎? 看的不明白你要表達的意思
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2014-7-10
在线时间
0 小时
 楼主| 发表于 2014-7-10 16:14:51 | 显示全部楼层
回复【2楼】溫柔一刀:
---------------------------------
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<u_485.tx_len)
{
UART0->TXD=u_485.buf[u_485.tx_ptr++];
}
else
{
init_uart_para(30,50,&u_485);
}
   }
   UART0->STA = status;
   return;
}
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2014-7-10
在线时间
0 小时
 楼主| 发表于 2014-7-10 16:16:40 | 显示全部楼层
回复【2楼】溫柔一刀:
---------------------------------
部分代码如上,当向串口发送帧消息时系统就会死机,看门狗复位。
回复

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2014-7-10
在线时间
0 小时
 楼主| 发表于 2014-7-11 16:13:35 | 显示全部楼层
回复【2楼】溫柔一刀:
---------------------------------
你好,代码你看了吗?可以看出哪边有问题吗?
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 17:12

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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