RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何將ThreadX移植到STM32H7平臺(tái)

CHANBAEK ? 來(lái)源:木南創(chuàng)智 ? 作者:尹家軍 ? 2022-12-14 14:40 ? 次閱讀

前面我們將ThreadX成功移植到了STM32F4平臺(tái),但這只是我們的部分應(yīng)用。我們希望將ThreadX的優(yōu)勢(shì)發(fā)揮到我們的更多應(yīng)用中,所以在這一篇中我們就來(lái)實(shí)現(xiàn)將ThreadX移植到STM32H7平臺(tái)中。

1、前期準(zhǔn)備

??在開(kāi)始將ThreadX移植到STM32H7平臺(tái)之前,我們需要做一些軟硬件方面的準(zhǔn)備。

??首先,我們需要準(zhǔn)備STM32H7的硬件平臺(tái)。這次我們采用STM32H750VBT6為控制單元來(lái)作為目標(biāo)平臺(tái)。這是一款我們?cè)趯?shí)際項(xiàng)目中使用的,經(jīng)過(guò)驗(yàn)證的,硬件能夠穩(wěn)定運(yùn)行的平臺(tái)。

??其次,我們需要準(zhǔn)備相應(yīng)的軟件資源,也就是ThreadX的源碼。ThreadX的源碼已經(jīng)開(kāi)源到Github上,其地址為:[https://github.com/azure-rtos/threadx,直接下載源碼就可以了。我們將采用目前最新的版本。下載好ThreadX的源碼后,我們將其解壓,如下圖:

??上圖中一目了然,無(wú)需做太多解釋。我們需要用到的文件主要存放在common文件夾和ports文件夾。其中common文件夾存放的是內(nèi)核源碼,ports文件夾存放的是不同平臺(tái)的接口文件。我們的硬件采用的是STM32H750VBT6,軟件開(kāi)發(fā)環(huán)境用的是IAR EWARM,所以我們選擇ports文件夾下cortex_m7下的IAR文件夾中的接口文件。

2、系統(tǒng)移植

??我們準(zhǔn)備好軟件硬件平臺(tái)后,就可以開(kāi)始系統(tǒng)的移植了。首先我們找到一個(gè)基礎(chǔ)的裸機(jī)項(xiàng)目,能正確實(shí)現(xiàn)硬件的啟動(dòng)及時(shí)鐘初始化就好了。接下來(lái)的移植工作主要包括:添加源碼,修改配置等。

??第一步,我們先向項(xiàng)目中添加ThreadX的相關(guān)源碼文件。所以我們?cè)陧?xiàng)目下添加ThreadX組、并在ThreadX組下添加Source和Ports兩個(gè)組用于添加文件。并將common文件夾和ports文件夾中的文件添加到對(duì)應(yīng)的分組。如下所示:

??然后要在項(xiàng)目屬性中為編譯器指定頭文件的引用路徑,主要是內(nèi)核函數(shù)的頭文件以及接口文件的頭文件兩個(gè)路徑,在我們這個(gè)項(xiàng)目中配置如下:

??PROJDIRPROJDIR....\\ThreadX\\common\\inc

??PROJDIRPROJDIR....\\ThreadX\\ports\\cortex_m4\\iar\\inc

??第二步,修改stm32h7xx_it.c文件。將其中的中斷響應(yīng)函數(shù)void PendSV_Handler(void)和void SysTick_Handler(void)去除。因?yàn)樵赥hreadX中已經(jīng)實(shí)現(xiàn)和使用。

??第三步,修改tx_initialize_low_level.s文件。這個(gè)文件負(fù)責(zé)建立各種系統(tǒng)數(shù)據(jù)結(jié)構(gòu),并提供定時(shí)中斷源。這個(gè)文件應(yīng)該是要針對(duì)不同的底層平臺(tái)編寫(xiě)。但在微軟提供的cortex_m7下IAR的接口例程中已經(jīng)提供 了一個(gè),所以我們基于這個(gè)文件進(jìn)行修改就可以了,主要根據(jù)實(shí)際應(yīng)用修改的是時(shí)鐘頻率。

??SYSTEM_CLOCK EQU 480000000

??SYSTICK_CYCLES EQU ((SYSTEM_CLOCK / 1000) -1)

??第四步,修改ThreadX的配置文件。ThreadX中要求使者提供一個(gè)tx_user.h的配置文件。當(dāng)然這個(gè)文件并不需要從頭編寫(xiě),在common\\inc目錄下有一個(gè)tx_user_sample.h文件,我們根據(jù)這個(gè)文件修改就可以了。

??經(jīng)過(guò)上述這四步操作,我們實(shí)際上已經(jīng)完成了對(duì)ThreadX內(nèi)核的移植,但還沒(méi)有辦法正確使用,因?yàn)槲覀冞€沒(méi)有定義具體的任務(wù)。

3、任務(wù)實(shí)現(xiàn)

??我們已經(jīng)完成了對(duì)ThreadX內(nèi)核文件以及接口文件的移植,接下來(lái)我們就來(lái)實(shí)現(xiàn)具體的應(yīng)用任務(wù)。ThreadX內(nèi)核實(shí)現(xiàn)基本應(yīng)用很簡(jiǎn)單,只涉及到2個(gè)函數(shù):tx_kernel_enter和tx_application_define,這兩個(gè)函數(shù)在頭文件“tx_api.h”中被聲明。事實(shí)上ThreadX內(nèi)核所有的對(duì)外函數(shù)都在“tx_api.h”中聲明,所以凡是我們需要使用內(nèi)核的地方必須引用“tx_api.h”頭文件。

??其中tx_kernel_enter實(shí)際是一個(gè)宏,真正的函數(shù)是_tx_initialize_kernel_enter,用于啟動(dòng)內(nèi)核,這個(gè)函數(shù)需要我們?cè)谥骱瘮?shù)中調(diào)用。調(diào)用這個(gè)函數(shù)后,內(nèi)核開(kāi)始運(yùn)行,多任務(wù)也將按照我們的設(shè)計(jì)循環(huán)運(yùn)行。

??而tx_application_define函數(shù)只有聲明沒(méi)有實(shí)現(xiàn),在_tx_initialize_kernel_enter函數(shù)中被調(diào)用,用于任務(wù)的創(chuàng)建。所有的任務(wù)都將在這個(gè)函數(shù)中被創(chuàng)建,而且不僅僅是任務(wù)在這個(gè)函數(shù)中創(chuàng)建,信號(hào)量、隊(duì)列、互斥量等都在這個(gè)函數(shù)中創(chuàng)建。

??我們將在tx_application_define函數(shù)創(chuàng)建任務(wù),這就需要用到tx_thread_create函數(shù)。這個(gè)函數(shù)的參數(shù)有10個(gè),包括任務(wù)控制塊、任務(wù)函數(shù)地址、任務(wù)棧的大小及地址、任務(wù)優(yōu)先級(jí)等。這些參數(shù)都是我們需要定義或聲明的。然后我們就可以編寫(xiě)tx_application_define函數(shù):

/*tx_application_define函數(shù)實(shí)現(xiàn)*/
void tx_application_define(void *first_unused_memory)
{
  /* 創(chuàng)建系統(tǒng)任務(wù) */
  tx_thread_create(&ThreadSystemTCB,       /* 任務(wù)控制塊地址 */  
                   "Thread System",       /* 任務(wù)名 */
                   ThreadSystem,         /* 啟動(dòng)任務(wù)函數(shù)地址 */
                   0,               /* 傳遞給任務(wù)的參數(shù) */
                   &ThreadSystemStack[0],      /* 堆棧基地址 */
                   THREAD_SYSTEM_STK_SIZE,  /* 堆??臻g大小 */ 
                   THREAD_SYSTEM_PRIO,    /* 任務(wù)優(yōu)先級(jí)*/
                   THREAD_SYSTEM_PRIO,    /* 任務(wù)搶占閥值 */
                   TX_NO_TIME_SLICE,        /* 不開(kāi)啟時(shí)間片 */
                   TX_AUTO_START);         /* 創(chuàng)建后立即啟動(dòng) */
   
  
  /* 創(chuàng)建模擬量處理任務(wù) */
  tx_thread_create(&ThreadAnalogTCB,        /* 任務(wù)控制塊地址 */  
                   "Thread Analog",         /* 任務(wù)名 */
                   ThreadAnalog,         /* 啟動(dòng)任務(wù)函數(shù)地址 */
                   0,               /* 傳遞給任務(wù)的參數(shù) */
                   &ThreadAnalogStack[0],      /* 堆?;刂?*/
                   THREAD_ANALOG_STK_SIZE,  /* 堆??臻g大小 */ 
                   THREAD_ANALOG_PRIO,    /* 任務(wù)優(yōu)先級(jí)*/
                   THREAD_ANALOG_PRIO,    /* 任務(wù)搶占閥值 */
                   TX_NO_TIME_SLICE,        /* 不開(kāi)啟時(shí)間片 */
                   TX_AUTO_START);        /* 創(chuàng)建后立即啟動(dòng) */
  
  
  /* 創(chuàng)建邏輯處理任務(wù) */
  tx_thread_create(&ThreadLogicTCB,        /* 任務(wù)控制塊地址 */   
                   "Thread Logic",       /* 任務(wù)名 */
                   ThreadLogic,         /* 啟動(dòng)任務(wù)函數(shù)地址 */
                   0,               /* 傳遞給任務(wù)的參數(shù) */
                   &ThreadLogicStack[0],       /* 堆?;刂?*/
                   THREAD_LOGIC_STK_SIZE, /* 堆??臻g大小 */ 
                   THREAD_LOGIC_PRIO,   /* 任務(wù)優(yōu)先級(jí)*/
                   THREAD_LOGIC_PRIO,   /* 任務(wù)搶占閥值 */
                   TX_NO_TIME_SLICE,        /* 不開(kāi)啟時(shí)間片 */
                   TX_AUTO_START);         /* 創(chuàng)建后立即啟動(dòng) */
  
  /* 創(chuàng)建通訊處理任務(wù) */
  tx_thread_create(&ThreadCommTCB,        /* 任務(wù)控制塊地址 */   
                   "Thread Comm",       /* 任務(wù)名 */
                   ThreadComm,          /* 啟動(dòng)任務(wù)函數(shù)地址 */
                   0,               /* 傳遞給任務(wù)的參數(shù) */
                   &ThreadCommStack[0],      /* 堆?;刂?*/
                   THREAD_COMM_STK_SIZE, /* 堆棧空間大小 */ 
                   THREAD_COMM_PRIO,   /* 任務(wù)優(yōu)先級(jí)*/
                   THREAD_COMM_PRIO,   /* 任務(wù)搶占閥值 */
                   TX_NO_TIME_SLICE,        /* 不開(kāi)啟時(shí)間片 */
                   TX_AUTO_START);         /* 創(chuàng)建后立即啟動(dòng) */
  
  /* 創(chuàng)建統(tǒng)計(jì)任務(wù) */
  tx_thread_create(&ThreadStatTCB,        /* 任務(wù)控制塊地址 */  
                   "Thread STAT",       /* 任務(wù)名 */
                   ThreadStat,         /* 啟動(dòng)任務(wù)函數(shù)地址 */
                   0,              /* 傳遞給任務(wù)的參數(shù) */
                   &ThreadStatStack[0],      /* 堆?;刂?*/
                   THREAD_IDLE_STK_SIZE,  /* 堆棧空間大小 */ 
                   THREAD_STAT_PRIO,    /* 任務(wù)優(yōu)先級(jí)*/
                   THREAD_STAT_PRIO,    /* 任務(wù)搶占閥值 */
                   TX_NO_TIME_SLICE,       /* 不開(kāi)啟時(shí)間片 */
                   TX_AUTO_START);        /* 創(chuàng)建后立即啟動(dòng) */
  
  
  /* 創(chuàng)建空閑任務(wù) */
  tx_thread_create(&ThreadIdleTCB,     /* 任務(wù)控制塊地址 */  
                   "Thread IDLE",      /* 任務(wù)名 */
                   ThreadIdle,       /* 啟動(dòng)任務(wù)函數(shù)地址 */
                   0,            /* 傳遞給任務(wù)的參數(shù) */
                   &ThreadIdleStack[0],   /* 堆?;刂?*/
                   THREAD_IDLE_STK_SIZE,  /* 堆棧空間大小 */ 
                   THREAD_IDLE_PRIO,    /* 任務(wù)優(yōu)先級(jí)*/
                   THREAD_IDLE_PRIO,    /* 任務(wù)搶占閥值 */
                   TX_NO_TIME_SLICE,    /* 不開(kāi)啟時(shí)間片 */
                   TX_AUTO_START);     /* 創(chuàng)建后立即啟動(dòng) */
}

??還要在主函數(shù)中調(diào)用 tx_kernel_enter函數(shù)以達(dá)到啟動(dòng)ThreadX內(nèi)核的目的。

4、最后測(cè)試

??完成前述的全部?jī)?nèi)容后,我們編譯下載到目標(biāo)平臺(tái),系統(tǒng)能夠正常運(yùn)行。添加ThreadX調(diào)試插件可以查看個(gè)任務(wù)的執(zhí)行情況如下:

??經(jīng)過(guò)上述測(cè)試,我們已經(jīng)成功的將ThreadX一直到立刻STM32H7平臺(tái),這樣余下的事情就是開(kāi)發(fā)具體的應(yīng)用了。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    8575

    瀏覽量

    151014
  • threadx
    +關(guān)注

    關(guān)注

    0

    文章

    15

    瀏覽量

    13828
  • STM32
    +關(guān)注

    關(guān)注

    2270

    文章

    10895

    瀏覽量

    355722
  • 移植
    +關(guān)注

    關(guān)注

    1

    文章

    379

    瀏覽量

    28124
  • stm32h7
    +關(guān)注

    關(guān)注

    0

    文章

    37

    瀏覽量

    1753
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    ThreadX GUIX是如何移植STM32H7

    第10章 ThreadX GUIX移植STM32H7(GCC)本章節(jié)將為大家介紹ThreadX GUIX的GCC方式
    發(fā)表于 08-06 08:29

    如何將freemodbus移植stm32平臺(tái)

    modbus是一個(gè)非常好的串口協(xié)議(當(dāng)然也能用在網(wǎng)口上),它簡(jiǎn)潔、規(guī)范、強(qiáng)大。可以滿(mǎn)足大部分的工業(yè)、嵌入式需求。這里詳細(xì)說(shuō)下如何將freemodbus移植stm32
    發(fā)表于 08-16 06:59

    學(xué)習(xí)ThreadX初步應(yīng)用并將其移植STM32平臺(tái)

    ThreadX初步應(yīng)用并將其移植STM32平臺(tái)中。1、前期準(zhǔn)備在開(kāi)始
    發(fā)表于 08-24 06:05

    ThreadX GUIX的GCC方式移植和設(shè)計(jì)框架

    怎樣ThreadX GUIX移植STM32H7(GCC)上去?在移植過(guò)程中要注意哪些事項(xiàng)?
    發(fā)表于 11-08 06:09

    如何將FreeModbus移植STM32平臺(tái)上去

    modbus是什么?如何將FreeModbus移植STM32平臺(tái)上?
    發(fā)表于 11-17 07:44

    STM32H7教程】第19章 STM32H7的GPIO應(yīng)用之按鍵FIFO

    STM32H7教程】第19章 STM32H7的GPIO應(yīng)用之按鍵FIFO
    發(fā)表于 11-23 18:21 ?9次下載
    【<b class='flag-5'>STM32H7</b>教程】第19章 <b class='flag-5'>STM32H7</b>的GPIO應(yīng)用之按鍵FIFO

    STM32H7學(xué)習(xí)之路繼續(xù)(stm32H7系列3) GPIO

    STM32H7學(xué)習(xí)之路繼續(xù)(stm32H7系列3) GPIO
    發(fā)表于 11-30 12:36 ?20次下載
    <b class='flag-5'>STM32H7</b>學(xué)習(xí)之路繼續(xù)(<b class='flag-5'>stm32H7</b>系列3)  GPIO

    STM32H7】第20章 ThreadX GUIX漢字顯示(QSPI Flash全字庫(kù))

    STM32H7】第20章 ThreadX GUIX漢字顯示(QSPI Flash全字庫(kù))
    發(fā)表于 12-02 09:36 ?14次下載
    【<b class='flag-5'>STM32H7</b>】第20章 <b class='flag-5'>ThreadX</b> GUIX漢字顯示(QSPI Flash全字庫(kù))

    STM32H7教程】第21章 STM32H7的NVIC中斷分組和配置(重要)

    STM32H7教程】第21章 STM32H7的NVIC中斷分組和配置(重要)
    發(fā)表于 12-04 14:36 ?13次下載
    【<b class='flag-5'>STM32H7</b>教程】第21章 <b class='flag-5'>STM32H7</b>的NVIC中斷分組和配置(重要)

    STM32H7教程】第8章 STM32H7的終極調(diào)試組件Event Recorder

    STM32H7教程】第8章 STM32H7的終極調(diào)試組件Event Recorder
    發(fā)表于 12-05 20:06 ?7次下載
    【<b class='flag-5'>STM32H7</b>教程】第8章 <b class='flag-5'>STM32H7</b>的終極調(diào)試組件Event Recorder

    STM32H7教程】第14章 STM32H7的電源,復(fù)位和時(shí)鐘系統(tǒng)

    STM32H7教程】第14章 STM32H7的電源,復(fù)位和時(shí)鐘系統(tǒng)
    發(fā)表于 12-09 11:21 ?36次下載
    【<b class='flag-5'>STM32H7</b>教程】第14章 <b class='flag-5'>STM32H7</b>的電源,復(fù)位和時(shí)鐘系統(tǒng)

    AN5293 STM32F7系列移植STM32H7系列

    AN5293 STM32F7系列移植STM32H7系列
    發(fā)表于 11-21 12:57 ?1次下載
    AN5293 <b class='flag-5'>STM32F7</b>系列<b class='flag-5'>移植</b><b class='flag-5'>到</b><b class='flag-5'>STM32H7</b>系列

    AN5293 STM32F7系列移植STM32H7系列

    AN5293 STM32F7系列移植STM32H7系列
    發(fā)表于 11-21 17:06 ?1次下載
    AN5293 <b class='flag-5'>STM32F7</b>系列<b class='flag-5'>移植</b><b class='flag-5'>到</b><b class='flag-5'>STM32H7</b>系列

    AN4936_從STM32F7STM32H7的軟件移植

    AN4936_從STM32F7STM32H7的軟件移植
    發(fā)表于 11-21 17:06 ?5次下載
    AN4936_從<b class='flag-5'>STM32F7</b><b class='flag-5'>到</b><b class='flag-5'>STM32H7</b>的軟件<b class='flag-5'>移植</b>

    如何將ThreadX移植STM32平臺(tái)

    現(xiàn)在一些小型系統(tǒng)中也往往有多任務(wù)處理的需求,這就為實(shí)時(shí)操作系統(tǒng)提供了用武之地。事實(shí)上國(guó)內(nèi)外各種各樣的RTOS有很多,而且基本都在走開(kāi)源的路線(xiàn),ThreadX也不例外,在這一篇中我們就來(lái)學(xué)習(xí)ThreadX初步應(yīng)用并將其移植
    的頭像 發(fā)表于 12-14 14:38 ?1731次閱讀
    <b class='flag-5'>如何將</b><b class='flag-5'>ThreadX</b><b class='flag-5'>移植</b><b class='flag-5'>到</b><b class='flag-5'>STM32</b><b class='flag-5'>平臺(tái)</b>
    RM新时代网站-首页