《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