哈哈哈哈哈操欧洲电影,久草网在线,亚洲久久熟女熟妇视频,麻豆精品色,久久福利在线视频,日韩中文字幕的,淫乱毛视频一区,亚洲成人一二三,中文人妻日韩精品电影

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

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

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

基于極海APM32F4的Azure RTOS ThreadX移植過(guò)程分享

Geehy極海半導(dǎo)體 ? 來(lái)源:21ic論壇極海半導(dǎo)體專區(qū) ? 2026-04-02 11:30 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

《極海芯得》系列內(nèi)容為用戶使用極海系列產(chǎn)品的經(jīng)驗(yàn)總結(jié),均轉(zhuǎn)載自21ic論壇極海半導(dǎo)體專區(qū),全文未作任何修改,未經(jīng)原文作者授權(quán)禁止轉(zhuǎn)載。

前言

最近在玩APM32F407IG的板子,發(fā)現(xiàn)官方提供了兩個(gè)RTOS的demo,FreeRTOSRT-thread。想著APM32F4這么豐富的資源,是不是也可以跑一下ThreadX RTOS看看。想著就動(dòng)手,本文記錄了APM32F4移植ThreadX RTOS的過(guò)程,供各位做個(gè)參考,權(quán)當(dāng)拋磚引玉了。

1 ThreadX簡(jiǎn)介

說(shuō)到RTOS,大家可能會(huì)想到FreeRTOS和我們國(guó)產(chǎn)的RT-Thread,這兩者的知名度都非常高。因?yàn)樗鼈兩逃妹赓M(fèi),組件也十分豐富。那ThreadX RTOS可能就“鮮為人知”了,但是在一些行業(yè)內(nèi),它可是“如雷貫耳”,因?yàn)樗线^(guò)天。O(∩_∩)O哈哈~,下面就簡(jiǎn)單介紹一些ThreadX。

ThreadX全名是Azure RTOS ThreadX(這里是它的官方網(wǎng)站:https://learn.microsoft.com/zh-cn/azure/rtos/threadx/)。它是專門為深度嵌入式實(shí)時(shí) IoT 應(yīng)用程序設(shè)計(jì)的。 Azure RTOS ThreadX 提供高級(jí)計(jì)劃、通信、同步、計(jì)時(shí)器、內(nèi)存管理和中斷管理功能。 此外,Azure RTOS ThreadX 具有許多高級(jí)功能,包括 picokernel 體系結(jié)構(gòu)、preemption-threshold 計(jì)劃、event-chaining、執(zhí)行分析、性能指標(biāo)和系統(tǒng)事件跟蹤。 Azure RTOS ThreadX 非常易于使用,適用于要求極其苛刻的嵌入式應(yīng)用程序。 Azure RTOS ThreadX 在各種產(chǎn)品(包括消費(fèi)者設(shè)備、醫(yī)療電子設(shè)備和工業(yè)控制設(shè)備)上的部署次數(shù)已達(dá)數(shù)十億次。(節(jié)選自其官網(wǎng))

為什么說(shuō)它厲害呢?以上內(nèi)容也僅是它的應(yīng)用介紹,這個(gè)RTOS的真正厲害之處在于其通過(guò)了各項(xiàng)安全認(rèn)證。以下便是其通過(guò)的安全認(rèn)證:

1. 醫(yī)療- FDA510(k),IEC-62304 Class C,IEC-60601,ISO-14971

2. 工業(yè)- UL-1998,IEC-61508 SIL 4

3. 運(yùn)輸/鐵路- EN50128 SIL 4,BS50128, 49CFR236,IEC-61508

4. 航空航天設(shè)備- DO-178B,ED-12B,DO-278

5. 汽車- IEC-61508 ASIL D

6. 核應(yīng)用- IEC-61508

7. 家電- UL/IEC 60730/60335

其實(shí)它之前是收費(fèi)閉源的,自被微軟收購(gòu)后就開源出來(lái)了,而且我們出于學(xué)習(xí)評(píng)估的目的,是不會(huì)被限制的。這個(gè)RTOS的厲害之處,大家可以查閱他們的官網(wǎng),這里就不贅述了。

2 源碼獲取

移植前我們需要準(zhǔn)備一些源碼

1. APM32F407的工程模板,這個(gè)可以在他們官網(wǎng)獲?。篽ttps://geehy.com/support/apm32?id=311

2. ThreadX源碼,這個(gè)可以在他們的開源倉(cāng)庫(kù)獲?。篽ttps://github.com/azure-rtos/threadx

需要注意的是,由于我們本次環(huán)境使用的是MDK環(huán)境,我們需要使用5.30以上的MDK。

3 文件移動(dòng)與復(fù)制

準(zhǔn)備好兩個(gè)源碼后,我們需要進(jìn)行一些文件移動(dòng)與復(fù)制工作以完成我們工程創(chuàng)建的前期準(zhǔn)備。

1. 的把ThreadX源碼復(fù)制至APM32F4xx_SDKMiddlewares文件夾中,準(zhǔn)備后續(xù)工程文件的使用。

89ffcfb2-2ced-11f1-90a1-92fbcf53809c.png

2. 然后創(chuàng)建ExamplesSysTick的例程副本,重新命名為“ThreadX_Template”。用以作為我們的基礎(chǔ)模板,我們將在該模板上建立APM32F4的ThreadX的demo。

3. 復(fù)制ThreadX源碼中的“portscortex_m4ac5example_build x_initialize_low_level.s”文件至我們的例程源碼目錄“ThreadX_TemplateThreadX_TemplateSource”并改名為“tx_initialize_low_level_ac5.s”,因?yàn)槲覀兒罄m(xù)要改動(dòng)該文件。這里復(fù)制出一個(gè)副本出來(lái)用于后續(xù)修改。

8a58818e-2ced-11f1-90a1-92fbcf53809c.png

4 添加源碼

這里我們選擇我們剛剛復(fù)制的ThreadX_Template的MDK工程中添加相應(yīng)的源文件。打開MDK工程,在現(xiàn)有目錄下添加“ThreadX/ports”,“ThreadX/common”結(jié)構(gòu),我們添加相應(yīng)的源碼文件。

8ab0e6d0-2ced-11f1-90a1-92fbcf53809c.png

4.1 ThreadX/port結(jié)構(gòu)

在該結(jié)構(gòu)下,我們添加AC5編譯器使用的.s文件。

1. 即“threadx-6.2.0_relportscortex_m4ac5src”下的所有 .s 文件。

2. 添加我們剛剛復(fù)制出來(lái)的tx_initialize_low_level_ac5.s文件。

最終添加文件如下:

8b09d1be-2ced-11f1-90a1-92fbcf53809c.png

4.2 ThreadX/common結(jié)構(gòu)

在該結(jié)構(gòu)下,我們添加ThreadX核心文件。即“threadx-6.2.0_relcommonsrc”下的.c文件。

4.3 Application結(jié)構(gòu)

在原Application結(jié)構(gòu)下添加我們一會(huì)要?jiǎng)?chuàng)建的線程文件:tx_application_entry.c。我們一會(huì)修改該文件內(nèi)容。

8b6235fc-2ced-11f1-90a1-92fbcf53809c.png

5 選項(xiàng)卡設(shè)置

5.1 編譯器設(shè)置

由于我們使用的是AC5的相關(guān)支持文件,我們這里選擇使用AC5編譯器,并勾選“Use MicroLIB”以使用printf。

8bbf0b56-2ced-11f1-90a1-92fbcf53809c.png

5.2 C/C++選項(xiàng)卡

在設(shè)置中的“C/C++”選項(xiàng)卡下的頭文件設(shè)置中添加頭文件路徑。

1. “..........Middlewares hreadx-6.2.0_relportscortex_m4ac5inc”

2. “..........Middlewares hreadx-6.2.0_relcommoninc”

8c184734-2ced-11f1-90a1-92fbcf53809c.png

5.3 匯編頭文件包含

在設(shè)置中的“Asm”選項(xiàng)卡需要完成以下設(shè)置:

1. 頭文件設(shè)置出添加頭文件路徑:“..........Middlewares hreadx-6.2.0_relportscortex_m4ac5inc”。

2. 在Misc Controls欄中填寫“--cpreproc”。以解決編譯.s文件報(bào)錯(cuò)問(wèn)題。

8c70880e-2ced-11f1-90a1-92fbcf53809c.png

6 修改源文件

由于ThreadX需要接管一些中斷,并且使用ThreadX我們需要?jiǎng)?chuàng)建一些線程,這里我們要對(duì)我們的工程里面的源碼進(jìn)行編輯。

6.1 tx_initialize_low_level_ac5.s

該文件是ThreadX RTOS用于完成處理器的底層初始化,包括:

1. 設(shè)置中斷向量表

2. 設(shè)置用于產(chǎn)生時(shí)鐘節(jié)拍的定位器(Systick)

3. 保存系統(tǒng)棧頂指針給中斷程序使用

4. 尋找RAM中首塊可用地址傳入tx_application_define函數(shù)供使用,也就是first_unused_memory指針的值

5. ThreadX在v6版本及以后,在這個(gè)文件中接管原有的處理器啟動(dòng)文件。

用于我這里還是想使用原有的處理器啟動(dòng)文件“startup_apm32f40x.s”,所以需要對(duì)“tx_initialize_low_level_ac5.s”文件進(jìn)行一番修改。

1. 將沒(méi)有用到的標(biāo)號(hào)注釋,手動(dòng)添加_Vectors和__initial_sp標(biāo)號(hào),分別是APM32F4啟動(dòng)文件中導(dǎo)出的中斷向量表和棧頂指針初始值:

8cc8e134-2ced-11f1-90a1-92fbcf53809c.png

2. 設(shè)置時(shí)鐘頻率(168Mhz)和時(shí)鐘節(jié)拍(1ms),該值用來(lái)初始化Systick定時(shí)器

8d21b52a-2ced-11f1-90a1-92fbcf53809c.png

3. 將設(shè)置堆棧的代碼全部注釋(堆棧環(huán)境已經(jīng)在APM32啟動(dòng)文件中設(shè)置了):

8d7baba2-2ced-11f1-90a1-92fbcf53809c.png

4. 將 ThreadX 定義的中斷向量表全部注釋(使用APM32F4啟動(dòng)文件中定義的向量表):

8dd667f4-2ced-11f1-90a1-92fbcf53809c.png

5. 注釋ThreadX定義的復(fù)位處理程序(使用APM32F4啟動(dòng)文件中的復(fù)位程序):

8e2fc01a-2ced-11f1-90a1-92fbcf53809c.png

6. 修改ThreadX底層初始化函數(shù):

8e88dc68-2ced-11f1-90a1-92fbcf53809c.png

7. 注釋用不到的函數(shù):

8ee06c08-2ced-11f1-90a1-92fbcf53809c.png

完成以上操作之后便是完成了對(duì)tx_initialize_low_level_ac5.s文件的修改。

6.2 apm32f4xx_int.c

由于ThreadX接管了部分中斷,apm32f4xx_int.c里面的一些中斷就必須進(jìn)行屏蔽(或刪除)處理,以免編譯器報(bào)重復(fù)定義的錯(cuò)誤。

即屏蔽PendSV_Handler和SysTick_Handler函數(shù)。

8f39aac0-2ced-11f1-90a1-92fbcf53809c.png

6.3 tx_application_entry.c

在該文件中我們創(chuàng)建兩個(gè)線程并運(yùn)行,需要使用到ThreadX的一些知識(shí),這里就不贅述,直接上源碼。

#include

#include"Board.h"

#include"tx_api.h"

#include"main.h"

#defineTX_APPLICATION1_PRIO 3

#defineTX_APPLICATION1_STACK_SIZE 1024

static TX_THREAD tx_application1;

uint8_t tx_application1_stack[TX_APPLICATION1_STACK_SIZE];

#defineTX_APPLICATION2_PRIO 2

#defineTX_APPLICATION2_STACK_SIZE 1024

static TX_THREAD tx_application2;

uint8_t tx_application2_stack[TX_APPLICATION2_STACK_SIZE];

void my_tx_application1_entry(ULONG thread_input)

{

/* Enter into a forever loop. */

while(1)

{

printf("ThreadX 1 application running... ");

APM_MINI_LEDToggle(LED2);

/* Sleep for 1500 tick. */

tx_thread_sleep(1500);

}

}

void my_tx_application2_entry(ULONG thread_input)

{

/* Enter into a forever loop. */

while(1)

{

printf("ThreadX 2 application running... ");

APM_MINI_LEDToggle(LED3);

/* Sleep for 1000 tick. */

tx_thread_sleep(1000);

}

}

void tx_application_define(void *first_unused_memory)

{

/* Create thread */

tx_thread_create(&tx_application1, "thread 1", my_tx_application1_entry, 0, &tx_application1_stack[0], TX_APPLICATION1_STACK_SIZE, TX_APPLICATION1_PRIO, TX_APPLICATION1_PRIO, TX_NO_TIME_SLICE, TX_AUTO_START);

tx_thread_create(&tx_application2, "thread 2", my_tx_application2_entry, 0, &tx_application2_stack[0], TX_APPLICATION2_STACK_SIZE, TX_APPLICATION2_PRIO, TX_APPLICATION2_PRIO, TX_NO_TIME_SLICE, TX_AUTO_START);

}

6.4 main.c

我們需要在main函數(shù)中初始化相應(yīng)的外設(shè)(LED、USART)后啟動(dòng)ThreadX。由于在tx_application_entry.c中使用了printf,我們還需要對(duì)printf進(jìn)行重定向。并刪除之前SysTick工程中一些操作,這里也閑話少敘,直接上源碼。

/* Includes */

#include"main.h"

#include"Board.h"

#include

#include"tx_api.h"

/** @addtogroup Examples

@{

*/

/** @addtogroup SysTick_TimeBase

@{

*/

/** @addtogroup SysTick_TimeBase_Macros Macros

@{

*/

/** printf using USART1 */

#defineDEBUG_USART USART1

/**@} end of group SysTick_TimeBase_Macros*/

/** @defgroup SysTick_TimeBase_Functions Functions

@{

*/

/*!

* [url=home.php?mod=space&uid=247401]@brief[/url] Main program

*

* @param None

*

* @retval None

*/

int main(void)

{

USART_Config_T usartConfigStruct;

usartConfigStruct.baudRate = 115200;

usartConfigStruct.hardwareFlow = USART_HARDWARE_FLOW_NONE;

usartConfigStruct.mode = USART_MODE_TX;

usartConfigStruct.parity = USART_PARITY_NONE;

usartConfigStruct.stopBits = USART_STOP_BIT_1;

usartConfigStruct.wordLength = USART_WORD_LEN_8B;

APM_MINI_COMInit(COM1, &usartConfigStruct);

APM_MINI_LEDInit(LED2);

APM_MINI_LEDInit(LED3);

printf("ThreadX RTOS on APM32F407 IG MINI Board ");

tx_kernel_enter();

while (1)

{

}

}

/*!

* [url=home.php?mod=space&uid=247401]@brief[/url] Redirect C Library function printf to serial port.

* After Redirection, you can use printf function.

*

* @param ch: The characters that need to be send.

*

* @param *f: pointer to a FILE that can recording all information

* needed to control a stream

*

* @retval The characters that need to be send.

*/

int fputc(int ch, FILE *f)

{

/** send a byte of data to the serial port */

USART_TxData(DEBUG_USART,(uint8_t)ch);

/** wait for the data to be send */

while (USART_ReadStatusFlag(DEBUG_USART, USART_FLAG_TXBE) == RESET);

return (ch);

}

7 編譯與下載

最后我們編譯工程,編譯結(jié)果如下。

8f9128ea-2ced-11f1-90a1-92fbcf53809c.png

然后我們下載程序進(jìn)板子后,LED2和LED3閃爍,若連接串口可以查看到如下信息:

8fe772b8-2ced-11f1-90a1-92fbcf53809c.png

注:文章作者在原帖中提供了代碼文件,有需要請(qǐng)至原文21ic論壇

原文地址:https://bbs.21ic.com/icview-3271244-1-1.html?_dsign=d8e4a5a2

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(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)注

    5208

    文章

    20603

    瀏覽量

    336500
  • threadx
    +關(guān)注

    關(guān)注

    0

    文章

    19

    瀏覽量

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

    關(guān)注

    1

    文章

    417

    瀏覽量

    29518
  • RTOS
    +關(guān)注

    關(guān)注

    25

    文章

    868

    瀏覽量

    123193

原文標(biāo)題:極海芯得 EP.78 | 基于APM32F4的Azure RTOS ThreadX 移植過(guò)程分享(基于AC5)

文章出處:【微信號(hào):geehysemi,微信公眾號(hào):Geehy極海半導(dǎo)體】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Azure RTOS ThreadX的搶占任務(wù)應(yīng)用實(shí)現(xiàn)與調(diào)試

    Azure RTOS ThreadX 是 Microsoft 提供的高級(jí)工業(yè)級(jí)實(shí)時(shí)操作系統(tǒng) (RTOS)。它是專門為深度嵌入式實(shí)時(shí) IoT 應(yīng)用程序設(shè)計(jì)的。
    發(fā)表于 07-12 11:17 ?3137次閱讀

    使用MM32F3270基于Azure RTOS定時(shí)器組的應(yīng)用

    Azure RTOS ThreadX 是 Microsoft 提供的高級(jí)工業(yè)級(jí)實(shí)時(shí)操作系統(tǒng) (RTOS)。它是專門為深度嵌入式實(shí)時(shí) IoT 應(yīng)用程序設(shè)計(jì)的。
    的頭像 發(fā)表于 12-29 17:26 ?2848次閱讀

    如何在Eclipse ThreadX RTOS中集成SystemView

    SEGGER實(shí)時(shí)軟件分析工具SystemView已經(jīng)在ThreadX v6.4.2上進(jìn)行了測(cè)試。SystemView從v3.60c版本支持Eclipse ThreadXAzure RTOS
    的頭像 發(fā)表于 05-06 17:11 ?1576次閱讀

    基于MM32 MCU的OS移植與應(yīng)用——ThreadX開篇

    /MM32F013x_Lib_Samples_V1.03.zip移植Azure RTOS ThreadX01功能驗(yàn)證在eMiniBoard
    發(fā)表于 11-09 10:30

    IDE在嘗試運(yùn)行或調(diào)試sample_threadx示例時(shí),顯示程序文件不存在怎么解決?

    sample_threadx 示例時(shí)遇到此問(wèn)題。程序文件不存在/Users/venkat/work/pp/azure_rtos/stm32f746g-disco/stm32cubeide
    發(fā)表于 01-11 07:23

    使用MM32F3270基于Azure RTOS定時(shí)器組的應(yīng)用

    各種產(chǎn)品(包括消費(fèi)者設(shè)備、醫(yī)療電子設(shè)備和工業(yè)控制設(shè)備)上的部署次數(shù)已達(dá)數(shù)十億次。在前文描述移植基本內(nèi)核的基礎(chǔ)上,該應(yīng)用手冊(cè)描述了MM32F3270系列MCU結(jié)合Azure RTOS
    發(fā)表于 02-07 14:18

    RT-Thread已經(jīng)全面支持APM32F1系列MCU

    近日,RT-Thread 和其高級(jí)會(huì)員合作伙伴半導(dǎo)體宣布:正式完成APM32F4系列MCU的RT-Thread 物聯(lián)網(wǎng)操作系統(tǒng)適配及RT-Thread Studio IDE的支持。
    發(fā)表于 08-30 09:45 ?1763次閱讀

    適用于Arduino 101的Azure RTOS ThreadX線程

    電子發(fā)燒友網(wǎng)站提供《適用于Arduino 101的Azure RTOS ThreadX線程.zip》資料免費(fèi)下載
    發(fā)表于 10-18 09:46 ?0次下載
    適用于Arduino 101的<b class='flag-5'>Azure</b> <b class='flag-5'>RTOS</b> <b class='flag-5'>ThreadX</b>線程

    AN1088_APM32F4xx系列ETH移植LWIP

    AN1088_APM32F4xx系列ETH移植LWIP
    發(fā)表于 11-09 21:03 ?0次下載
    AN1088_<b class='flag-5'>APM32F4</b>xx系列ETH<b class='flag-5'>移植</b>LWIP

    AN1089_APM32F407_RTOS例程

    AN1089_APM32F407_RTOS例程
    發(fā)表于 11-09 21:03 ?2次下載
    AN1089_<b class='flag-5'>APM32F407_RTOS</b>例程

    DB4560_STM32F4 系列用于 STM32Cube 的 Azure? RTOS 軟件擴(kuò)展

    DB4560_STM32F4 系列用于 STM32Cube 的 Azure? RTOS 軟件擴(kuò)展
    發(fā)表于 11-23 08:30 ?0次下載
    DB4560_STM32<b class='flag-5'>F4</b> 系列用于 STM32Cube 的 <b class='flag-5'>Azure</b>? <b class='flag-5'>RTOS</b> 軟件擴(kuò)展

    使用MM32F3270基于Azure RTOS信號(hào)量的應(yīng)用

    Azure RTOS ThreadX 是 Microsoft 提供的高級(jí)工業(yè)級(jí)實(shí)時(shí)操作系統(tǒng) (RTOS)。它是專門為深度嵌入式實(shí)時(shí) IoT 應(yīng)用程序設(shè)計(jì)的。
    的頭像 發(fā)表于 12-16 09:23 ?2141次閱讀

    使用MM32F3270基于Azure RTOS動(dòng)態(tài)內(nèi)存管理的應(yīng)用

    Azure RTOS ThreadX 是 Microsoft 提供的高級(jí)工業(yè)級(jí)實(shí)時(shí)操作系統(tǒng) (RTOS)。它是專門為深度嵌入式實(shí)時(shí) IoT 應(yīng)用程序設(shè)計(jì)的。
    的頭像 發(fā)表于 12-23 11:01 ?2066次閱讀

    使用MM32F3270基于Azure RTOS (ThreadX) 的移植

    使用MM32F3270基于Azure RTOS (ThreadX) 的移植
    的頭像 發(fā)表于 10-27 10:15 ?1669次閱讀
    使用MM32<b class='flag-5'>F</b>3270基于<b class='flag-5'>Azure</b> <b class='flag-5'>RTOS</b> (<b class='flag-5'>ThreadX</b>) 的<b class='flag-5'>移植</b>

    微軟開源Azure RTOS,并更名為Eclipse ThreadX

    Azure RTOS 是一個(gè)帶有 ThreadX 實(shí)時(shí)操作系統(tǒng)(RTOS)的嵌入式開發(fā)套件。ThreadX 是一個(gè)普及性很高的小型
    的頭像 發(fā)表于 12-01 16:17 ?1583次閱讀
    微軟開源<b class='flag-5'>Azure</b> <b class='flag-5'>RTOS</b>,并更名為Eclipse <b class='flag-5'>ThreadX</b>
    井冈山市| 会同县| 台山市| 习水县| 四会市| 齐河县| 政和县| 平定县| 晋中市| 合阳县| 平江县| 海盐县| 房产| 陆丰市| 祁门县| 馆陶县| 灵山县| 玉环县| 西安市| 建德市| 嵩明县| 上虞市| 合川市| 扎赉特旗| 华池县| 五河县| 祥云县| 仪征市| 苍梧县| 莫力| 浮梁县| 龙里县| 保定市| 长垣县| 龙陵县| 肥乡县| 高淳县| 沈丘县| 镇康县| 新乐市| 建昌县|