之前裸機emWin成功了,接下來嘗試CubeMx FreeRTOS emWin,又遇到三個坑。
先說第一個坑:
我直接再之前裸機的工程上增加FreeRTOS,結果生成程序後,編譯報一大堆錯誤,分析了一下錯誤實在是無從下手,因此懷疑CubeMx有問題,因此我就將Keil工程文件夾全部刪除,再重新生成。再次編譯情況好轉,但是還是不少錯誤。這是第二個坑!
第二個坑:
CubeMx配置FreeRTOS選項中有2個版本,分別是CMSIS_V1和CMSIS_V2 。我看到選項自然是選高版本,結果生成程序後編譯報一大堆錯誤(如下圖),查了半天也不好解決。關鍵是我個人認爲既然是軟件自動生成的,不應該需要我來改動,否則編程過程中後續再修改配置有可能會出錯。所以不得不換CMSIS_V1。
換CMSIS_V1後編譯通過,於是嘗試添加觸摸功能,這時又遇到了第三個坑。
第三個坑:
我在OS中增加了一個軟定時,準備用來輪詢讀取觸摸座標,結果發現程序無法進入定時器回調函數。又是一遍遍的排查。中間做了多少啥事就不表了,最後發現問題所在,先看代碼:
1、freertos.c中的代碼:
/* USER CODE END Header_StartDefaultTask */
void StartDefaultTask(void const * argument)
{
/* Graphic application */
GRAPHICS_MainTask(); //此處調用了GUI_App.c中的主函數
/* USER CODE BEGIN StartDefaultTask */
/* Infinite loop */
for(;;)
{
HAL_GPIO_TogglePin(LED2_GPIO_Port,LED2_Pin);
osDelay(100);
}
/* USER CODE END StartDefaultTask */
}
2、GUI_App.c
void GRAPHICS_MainTask(void) {
/* 2- Create a Window using GUIBuilder */
CreateWindow();
/* USER CODE BEGIN GRAPHICS_MainTask */
/* User can implement his graphic application here */
/* Hello Word example */
GUI_Clear();
GUI_SetColor(GUI_WHITE);
GUI_SetFont(&GUI_Font32_1);
GUI_DispStringAt("Hello world!", (LCD_GetXSize()-150)/2, (LCD_GetYSize()-20)/2);
/* USER CODE END GRAPHICS_MainTask */
while(1)
{
GUI_Delay(100);
}
}
紅色部分while(1)死循環造成問題。將這部分程序註釋關閉後,程序運行正常!