|
小弟最近移植了一个FreeRtos到STM32F103CB系列的芯片中,遇到一个问题,问题如下:
{
//创建数据发送任务
xTaskCreate((TaskFunction_t )gsm4_task,
(const char* )"gsm4_task",
(uint16_t )GSM4_STK_SIZE,
(void* )NULL,
(UBaseType_t )GSM4_TASK_PRIO,
(TaskHandle_t* )&Gsm4Task_Handler);
//创建数据解析任务
xTaskCreate((TaskFunction_t )gsm4_data_task,
(const char* )"gsm4_data_task",
(uint16_t )GSM4_DATA_STK_SIZE,
(void* )NULL,
(UBaseType_t )GSM4_DATA_TASK_PRIO,
(TaskHandle_t* )&gsm4_data_Task_Handler);
//创建联网任务
xTaskCreate((TaskFunction_t )gsm4_check_task,
(const char* )"gsm4_check_task",
(uint16_t )GSM4_CHECK_STK_SIZE,
(void* )NULL,
(UBaseType_t )GSM4_CHECK_TASK_PRIO,
(TaskHandle_t* )&Gsm4_check_Task_Handler);
//创建TASK2任务
//采集数据任务
xTaskCreate((TaskFunction_t )task2_task,
(const char* )"task2_task",
(uint16_t )TASK2_STK_SIZE,
(void* )NULL,
(UBaseType_t )TASK2_TASK_PRIO,
(TaskHandle_t* )&Task2Task_Handler);
}
如上是我的一系列任务函数,在task2_task任务中,我有一个使用485采集数据函数。如下:
{
xTaskNotifyGive(Task2Task_Handler);//发送采集数据任务通知,采集数据
while(1)
{
NotifyValue=ulTaskNotifyTake(pdTRUE,0); //获取任务通知
xTaskNotifyGive(Task2Task_Handler);//发送采集数据任务通知,采集数据
if(NotifyValue==1) //清零之前的任务通知值为1,说明任务通知有效
{
vTaskSuspend(Oled_Task_Handler);
my_printf("7WAITTING...");
memset(buf,0,sizeof(buf)); //清空数据缓存
memset(ec_data.value,0,sizeof(ec_data.value)); //清空数据缓存
// u3_printf("接收到任务通知,采集数据\r\n");
Event_Scheduling();
}
}
}
在该函数中,我用来采集某个传感器的数据,但应要求,这必须得在一个周期内采集完成,采集完成后,需要计算这个数据的每秒的输出量。
其架构大概就是:
0-20s采集数据
25s计算数据
30s清空485串口的缓冲区
所以我使用了一个TIM2去计时,然后发现,我的定时器计数,但是系统没有执行我原本设想的485发送数据函数。
串口1的发送数据是我用于调试使用的。
然而我发现定时器有在不停计数,但是并没有执行我的任务。
{
rain_time = 195
rain_time = 196
rain_time = 197
rain_time = 198
rain_tim% = 199
vain_time0= 200
rain_time = 201
卹ain_time = 202
}
按照我的设定在时间等于20s 即计数为200时,并且发送485数据,且延时4s。但实际上并没有执行我的函数, 我个人猜测是任务执行过程中,即使满足了其时间的条件,本质上也还是没有进入到该函数中,估计在跑其他任务(我个人猜测)。
最后小弟请问该怎么才能解决这个问题,麻烦各位大佬了!!
|
-
1.png
(49.76 KB, 下载次数: 42)
|