CubeIDE 移植 threadx
本系列教程均基于正點原子
L475
潘多拉開發闆為硬體平台。項目開源位址 github 位址
threadx 移植(一)-CubeIDE 建立 LED 閃爍工程
threadx 移植(二)-基于 CubeIDE 移植 threadx
threadx 移植(三)-添加序列槽列印功能
下載下傳 threadx 源碼
threadx 源碼 github 倉庫位址
移植所需要的全部檔案
因為 stm32l475 使用的核心為 conter-m4,使用的開發環境為
CubeIDE
,是以選擇
ports
檔案的時候選擇
cm4
以及
gnu
。
-
檔案夾下所有源檔案common/src
-
檔案夾下所有頭檔案common/inc
-
檔案夾下所有源檔案ports/cortex_m4/gnu/src
-
檔案夾下的所有頭檔案ports/cortex_m4/gnu/inc
-
檔案夾下的ports/cortex_m4/gnu/example_build
檔案tx_initialize_low_level.S
以上所列即為移植
threadx
最小系統所需要的全部檔案
添加源碼到工程
将上述檔案添加到本地工程的檔案夾中,
CubeIDE
會自動将檔案的目錄結構顯示在工程中,如果沒有顯示重新整理工程即可,添加完成之後工程目錄如下所示:
工程目錄結構和本地資源目錄結構是一緻的,這裡隻是修改了工程目錄結構,但是源碼并不會參與編譯,而且頭檔案路徑也沒有設定。
添加頭檔案路徑
右鍵工程,選擇
Properties
屬性,如下圖所示
添加彙編檔案的頭檔案路徑
彙編檔案的頭檔案添加完成之後如下
C 檔案的頭檔案路徑
c 檔案頭檔案路徑添加完成之後如下圖
彙編和 C 頭檔案添加完畢之後将設定儲存
将源碼參與編譯
添加完成之後
threadx
檔案夾會有一個
c
的标志,如下圖所示
編譯程式
将
threadx
源碼加入工程參與編譯後會報錯,接下來就一個一個解決報錯。
中斷服務函數重定義報錯
multiple definition of `SysTick_Handler'
multiple definition of `PendSV_Handler'
threadx
系統中會用到這兩個中斷服務函數,是以需要屏蔽掉
stm32l4xx_it.c
檔案中工程自帶的這兩個中斷服務函數。
中斷向量表未定義報錯
threadx/ports/cortex_m4/gnu/example_build/tx_initialize_low_level.S:114: undefined reference to `_vectors'
将
tx_initialize_low_level.S
檔案中的
_vectors
換為自己的中斷向量表,例如本例中
startup_stm32l475vetx.s
啟動檔案中定義了中斷向量表為
g_pfnVectors
,将其替換即可。
__RAM_segment_used_end__
未定義報錯
__RAM_segment_used_end__
undefined reference to `__RAM_segment_used_end__'
需要在連結腳本中指定未使用的
RAM
位址,是以在連結腳本棧中棧結束的地方指定為
RAM
未使用的位址
._user_heap_stack :
{
. = ALIGN(8);
PROVIDE ( end = . );
PROVIDE ( _end = . );
. = . + _Min_Heap_Size;
. = . + _Min_Stack_Size;
. = ALIGN(8);
__RAM_segment_used_end__ = .;
} >RAM
至此,編譯報錯已經全部解決
啟動作業系統核心
main.c
檔案中包含
threadx
系統頭檔案
tx_api.h
,并在
while(1)
之前調用
tx_kernel_enter()
函數,此時會報錯
undefined reference to `tx_application_define'
是以需要自己定義
tx_application_define
這個函數,并在這個函數中啟動一個線程來進行
LED
的閃爍,示例代碼如下:
TX_THREAD demo_thread;
#define DEMO_STACK_SIZE 1024
static uint8_t thread_stack[DEMO_STACK_SIZE];
void demo_thread_entry(ULONG thread_input)
{
/* This thread simply sits in while-forever-sleep loop. */
while(1)
{
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_7, GPIO_PIN_RESET);
tx_thread_sleep(1000);
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_7, GPIO_PIN_SET);
tx_thread_sleep(1000);
}
}
void tx_application_define(void *first_unused_memory)
{
/* Create the main thread. */
tx_thread_create(&demo_thread,
"demo thread",
demo_thread_entry,
0,
thread_stack,
DEMO_STACK_SIZE,
1,
1,
TX_NO_TIME_SLICE,
TX_AUTO_START);
}
編譯下載下傳,可以看到
LED
已經成功的閃爍,至此,
threadx
已經移植成功。