芯得EP.21丨基于極海APM32F4的TencentOS Tiny實時操作系統移植詳解

《APM32芯得》系列內容為用戶使用APM32系列產品的經驗總結,均轉載自21ic論壇極海半導體專區,全文未作任何修改,未經原文作者授權禁止轉載。

如遇技術問題,可前往?極海半導體開發者論壇

1?前言

最近在了解TencentOS的特性,據了解它的一些特點:

1.?資源占用極少

2.?高效功耗管理框架

3.?自動移植工具

4.?最后一屏調試工具

5.?安全分級方案

它的官網這里:https://cloud.tencent.com/product/tos-tiny

正好我手上有極海家的APM32F407IGMINI板卡,我便計劃基于這塊板卡移植TencentOS來看看。

本文將記錄移植的過程,也請各位大神多多斧正。

2 APM32F4?源碼準備

我們去極海官網下載APM32F4的SDK包:

https://geehy.com/uploads/tool/APM32F4xx_SDK_V1.4.zip

打開SDK包我們找一個“順眼的”demo作為我們的基礎,以移植TencentOS,對就是你了“SysTick”例程。

本次我計劃在MDK上實現APM32F4的TencentOS適配,所以我將選擇“SysTick”例程的MDK工程。為了不和原工程混淆,我把“SysTick_TimeBase”復制至\Examples\RTOS目錄下:

把“SysTick_TimeBase”名字改為“TencentOS”。

3 TencentOS源碼獲取

我們去TencentOS的Github倉庫下載其最新的源碼:

https://github.com/OpenAtomFoundation/TencentOS-tiny

關于TencentOS的源碼我們比較關系的重要內容有:

由于我手上的APM32F4?尚未被TencentOS支持,所以我們在“board”文件夾中未能找到我們需要的東西,但可做參考。

本次考慮的是能夠使得APM32F407正常運行TencentOS,所以我們更關心的是TencentOS tiny?適配的?IP?核架構、TencentOS tiny?內核源碼這兩部分的內容。

下面我們復將TencentOS源碼復制或解壓至“APM32F4xx_SDK_V1.4\Middlewares”文件夾中。

至此我們完成了源碼的獲取工作,接下來我們將進入MDK的工程設置進行一步步的把TencentOS移植。

4?移植TencentOS至APM32F407

打開我們剛剛在第2節中準備的工程:

我們將在該工程上進行修改。

4.1 TencentOS?源文件包含

首先我們先創建用于保存TencentOS的文件目錄結構:

分別是:

1. TencentOS/arch

?用于存放arch平臺代碼。

2. TencentOS/kemel

?用于存放TencentOS內核源碼,

3. TencentOS/cmsis_os

?用于存放cmsis os?源碼,

4.2 TencentOS?頭文件路徑包含

完成源文件包含后我們將所需的頭文件包含進我們的工程。

4.3?復制tos_config.h

我們將和APM32F4?相同架構的STM32L431demo下的tos_config.h(APM32F4xx_SDK_V1.4\Middlewares\TencentOS-tiny\board\BearPi_STM32L431RC\TOS-CONFIG)文件復制到我們的目錄下:

4.4?修改源碼

4.4.1?修改tos_config.h的頭文件包含為“apm32f4xx.h”

4.4.2?注釋PendSV_Handler

注釋掉apm32f4xx_int.c里面的PendSV_Handler函數,該函數將由TencentOS接管。

4.4.3?修改SysTick_Handler

TencentOS?需要SysTick做為時基,在“apm32f4xx_int.c”的頭部增加“tos_k.h”引用。

然后修改SysTick_Handler函數如下:

void SysTick_Handler(void)

{

//?TimingDelay_Decrement();

if (tos_knl_is_running())

{

tos_knl_irq_enter();

tos_tick_handler();

tos_knl_irq_leave();

}

}

4.4.4?修改main.c

在?main.c?中添加TencentOS tiny?頭文件,編寫任務函數:

任務函數編寫可以參考官方提供的demo:

//task1

#define TASK1_STK_SIZE?256

void task1(void *pdata);

osThreadDef(task1, osPriorityNormal, 1, TASK1_STK_SIZE);

//task2

#define TASK2_STK_SIZE?256

void task2(void *pdata);

osThreadDef(task2, osPriorityNormal, 1, TASK2_STK_SIZE);

void task1(void *pdata)

{

int count = 1;

while (1)

{

printf("\r\nHello world!\r\n###This is task1 ,count is %d \r\n", count++);

APM_MINI_LEDToggle(LED2);

osDelay(2000);

}

}

void task2(void *pdata)

{

int count = 1;

while (1)

{

printf("\r\nHello TencentOS !\r\n***This is task2 ,count is %d \r\n", count++);

APM_MINI_LEDToggle(LED3);

osDelay(1000);

}

}

然后將main函數修改如下:

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);

osKernelInitialize();//TOS Tiny kernel initialize

osThreadCreate (osThread(task1),NULL);//Create task1

osThreadCreate(osThread(task2),NULL);//Create task2

osKernelStart ();//Start Tos Tiny

while (1)

{

}

}

至此我們完成了代碼的編寫工作。

5?編譯下載

完成代碼的編寫工作后,我們編譯工程:

進行下載(我使用的是jlink)。然后使用串口線連接MINI板,打開串口助手可以看到兩個任務可以正常打印,LED按照各自的延時時間正常閃爍。

至此,基于APM32F4的TencentOS 適配工作完成。你也來試試看吧。

注:文章作者在原帖中提供了工程文件,有需要請至原文21ic論壇下載

原文地址:https://bbs.21ic.com/icview-3325166-1-1.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/913030.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/913030.shtml
英文地址,請注明出處:http://en.pswp.cn/news/913030.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Docker基礎】Docker數據持久化與卷(Volume)介紹

目錄 1 Docker數據持久化概述 1.1 為什么需要數據持久化 1.2 Docker數據管理方式對比 2 Docker卷(Volume)核心概念 2.1 數據卷基本特性 2.2 卷類型詳解 2.2.1 命名卷(Named Volumes) 2.2.2 匿名卷(Anonymous Volumes) 2.2.3 主機綁定卷(Host Volumes) 3 數據卷操作全…

yolo8,10,11之處理不平衡類別問題

一、前言 使用 yolo11進行目標檢測時,發現訓練數據集存在類別數量不平衡的情況,查閱了一下資料,可采取以下方法。 二、樣本增強 少數類的框是獨立存在于圖片中,則可通過顏色、亮度、幾何變換等方法人為增加少數類的樣本數&#x…

基于 51 單片機做的二十四點小游戲

用 51 單片機做的二十四點小游戲 一、任務要求 設計一個模擬紙牌 24 點玩法的單片機模擬器,由單片機隨機發出四個牌點,測試者在實驗板按鍵上輸入計算過程,單片機判斷計算結果是否正確,并評定測試者的成績。 【基本要求】&#…

Hadoop WordCount 程序實現與執行指南

Hadoop WordCount 程序實現與執行指南 下面是使用Python實現的Hadoop WordCount程序,包含完整的Mapper和Reducer部分。 這個程序可以在PyCharm中本地測試,也可以部署到遠程Hadoop集群上運行。 mapper.py import sys# 從標準輸入讀取數據 for line in sys.stdin:# 移除行首…

數據可視化:5 分鐘讀懂其核心價值與技術實踐

為什么數據可視化成為企業數字化轉型的“必修課”?在信息爆炸的時代,企業每天產生海量數據,從客戶行為到銷售業績,從供應鏈運作到市場趨勢。如何從這些原始數據中快速提煉有價值的信息?如何將復雜數據轉化為直觀易懂的…

Python 量化交易安裝使用教程

一、什么是量化交易? 量化交易是通過數學模型和計算機程序,自動化地執行證券買賣決策的交易方式。Python 憑借其豐富的生態和強大的數據處理能力,成為量化交易的首選語言。 二、環境準備 建議使用 Anaconda 安裝 Python 3.8,方便…

從 PostgreSQL 到 DolphinDB:數據實時同步一站式解決方案

隨著越來越多的用戶使用 DolphinDB,各種不同的應用的場景也對 DolphinDB 的數據接入提出了不同的要求。部分用戶需要將 PostgreSQL 的數據實時同步到 DolphinDB 中來,以滿足在 DolphinDB 中使用數據的實時性需求。本篇教程將介紹使用 Debezium 來實時捕獲…

關于聯詠(Novatek )白平衡色溫坐標系探究

目錄 一、疑問 二、結論 三、分析 四、釋疑 五、仿真模擬 一、疑問 為什么Novatek的白平衡色溫坐標系是這個樣子的呢?各條直線和曲線分別代表什么含義呢?色溫坐標系中所標定的參數代表什么含義呢?如何標定新增一些特殊的光源呢?二、結論

Protein FID:AI蛋白質結構生成模型評估新指標

一、引言:蛋白質生成模型面臨的評估挑戰 近年來,AI驅動的蛋白質結構生成模型取得了令人矚目的進展,但如何有效評估這些模型的質量卻一直是一個懸而未決的問題。雖然實驗驗證仍然是金標準,但計算機模擬評估對于快速開發和比較機器…

Vim 高效編輯指南:從基礎操作到塊編輯的進階之路

文章目錄?? 一、基礎編輯命令(生存必備)? 二、進階操作:可視化塊模式 (Ctrl+v)典型應用場景?? 三、效率提升技巧?? 四、配置建議(~/.vimrc)結語作為開發者最強大的文本編輯器之一,Vim 的高效操作離不開其命令模式(Normal Mode)。本文將系統性地介紹 Vim 的核心編…

docker學習第一天框架學習以及在redhat7.9安裝操作

一.docker是什么。 Docker 是一個開源的容器化平臺,通過將應用程序及其依賴項(如代碼、運行時環境、系統工具等)打包到輕量級、可移植的容器中,實現「一次構建,處處運行」的現代化開發模式。它利用了 Linux 內核特性來…

QT控件 使用Font Awesome開源圖標庫修改QWidget和QML兩種界面框架的控件圖標

又一個月快要結束了,在這里總結下分別在QWidget和QML兩種界面設計模式中應用Font Awesome開源圖標庫,修改界面的顯示圖標效果, AriaNg是aria2的可視化web界面工具,其中的圖標大都是Font AWesome中的字體圖標,某位曾經嘗試將AriaNg…

Qt Quick 與 QML(四)qml中的Delegate系列委托組件

一、概念 在QML中,Delegate是一種非常重要的組件,特別是在使用ListView、GridView、PathView等視圖組件時。Delegate用于定義每個列表或網格中的項目是如何展示的。通過自定義Delegate,你可以控制每個項目的外觀和行為。 Delegate通常是一個…

android圖片優化

在 Android 中加載大圖時,如果不進行優化處理,很容易導致內存溢出(OOM)和應用卡頓。以下是幾種高效處理大圖加載的方法和最佳實踐: 1. 使用圖片加載庫(推薦) 成熟的第三方庫已經處理了內存管理…

【機器人】復現 DOV-SG 機器人導航 | 動態開放詞匯 | 3D 場景圖

DOV-SG 建了動態 3D 場景圖,并使用LLM大型語言模型進行任務分解,從而能夠在交互式探索過程中對 3D 場景圖進行局部更新。 來自RA-L 2025,適合長時間的 語言引導移動操作,動態開放詞匯 3D 場景圖。 論文地址:Dynamic …

mongodb 中dbs 時,local代表的是什么

在 MongoDB 中,local 是一個內置的系統數據庫,用于存儲當前 MongoDB 實例(或副本集節點)的元數據和內部數據,與其他數據庫不同,local 數據庫的數據不會被復制到副本集的其他成員。 local 數據庫的核心作用 …

Spring Cloud(微服務部署與監控)

📌 摘要 在微服務架構中,隨著服務數量的增長和部署復雜度的提升,如何高效部署、持續監控、快速定位問題并實現自動化運維成為保障系統穩定性的關鍵。 本文將圍繞 Spring Cloud 微服務的部署與監控 展開,深入講解: 微…

音頻動態壓縮算法曲線實現

Juce實現動態壓縮曲線繪制 動態范圍壓縮算法(Dynamic Range Compression,DRC)是將音頻信號的動態范圍映射到一個較小的范圍內的過程,即降低較高的峰值的信號電平,而不處理較安靜的部分。DRC被廣泛用于音頻錄制、制作工…

技術視界 | OpenLoong 控制框架:打造通用人形機器人智能系統的中樞基座

在人形機器人向通用性、智能化方向加速演進的當下,控制系統的角色正在發生根本變化:它不再只是底層驅動的接口適配層,也不只是策略調用的轉譯引擎,而是成為連接具身模型、異構本體與多樣化任務的“中樞神經系統”。 在 2025 年張…

IOS 藍牙連接

最近做一個硬件設備,寫IOS相應的數據連接/分析代碼時;發現一個問題,如果是開機,每次都能連接上。連接斷開后,發現再也掃描不到了。通過第三方工具LightBlue,發現信號是-127。 此時進入設置查看藍牙設備&am…