天天看點

threadx 移植(二)-基于 CubeIDE 移植 threadx

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

會自動将檔案的目錄結構顯示在工程中,如果沒有顯示重新整理工程即可,添加完成之後工程目錄如下所示:

threadx 移植(二)-基于 CubeIDE 移植 threadx

工程目錄結構和本地資源目錄結構是一緻的,這裡隻是修改了工程目錄結構,但是源碼并不會參與編譯,而且頭檔案路徑也沒有設定。

添加頭檔案路徑

右鍵工程,選擇

Properties

屬性,如下圖所示

threadx 移植(二)-基于 CubeIDE 移植 threadx

添加彙編檔案的頭檔案路徑

threadx 移植(二)-基于 CubeIDE 移植 threadx

彙編檔案的頭檔案添加完成之後如下

threadx 移植(二)-基于 CubeIDE 移植 threadx

C 檔案的頭檔案路徑

threadx 移植(二)-基于 CubeIDE 移植 threadx

c 檔案頭檔案路徑添加完成之後如下圖

threadx 移植(二)-基于 CubeIDE 移植 threadx

彙編和 C 頭檔案添加完畢之後将設定儲存

将源碼參與編譯

threadx 移植(二)-基于 CubeIDE 移植 threadx

添加完成之後

threadx

檔案夾會有一個

c

的标志,如下圖所示

threadx 移植(二)-基于 CubeIDE 移植 threadx

編譯程式

threadx

源碼加入工程參與編譯後會報錯,接下來就一個一個解決報錯。

中斷服務函數重定義報錯

multiple definition of `SysTick_Handler'
 multiple definition of `PendSV_Handler'
           

threadx

系統中會用到這兩個中斷服務函數,是以需要屏蔽掉

stm32l4xx_it.c

檔案中工程自帶的這兩個中斷服務函數。

threadx 移植(二)-基于 CubeIDE 移植 threadx

中斷向量表未定義報錯

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__

未定義報錯

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

已經移植成功。