|
小弟最近移植了一個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)
下載附件
2021-9-14 19:30 上傳
|