天?。※Z廠(chǎng)都開(kāi)始做開(kāi)發(fā)板了?讓我們一睹為快!
掃描二維碼
隨時(shí)隨地手機(jī)看文章
1、騰訊物聯(lián)網(wǎng)開(kāi)發(fā)板開(kāi)箱
前幾天拿到了騰訊汪總贈(zèng)送的EVB_MX+
以及EVB_LX
開(kāi)發(fā)板,它們長(zhǎng)下面這個(gè)樣子,看起來(lái)很輕便,即使是外出我也可以隨身帶著它隨時(shí)隨地進(jìn)行玩耍,就和小熊派一樣,整體給人感覺(jué)就非常舒服。
一看這個(gè)開(kāi)發(fā)板外觀(guān)以及包裝盒大家就想到了之前的小熊派,不錯(cuò),它們可是有血緣關(guān)系的!但EVB_MX+的資源更加豐富噢!有關(guān)小熊派的評(píng)測(cè)文章如下:
網(wǎng)紅物聯(lián)網(wǎng)開(kāi)發(fā)板小熊派使用評(píng)測(cè)
迫不及待開(kāi)啟評(píng)測(cè)模式,我們先來(lái)看看這兩個(gè)開(kāi)發(fā)板的基本介紹以及功能分布,最后選取一個(gè)入門(mén)最快的平臺(tái),移植TecentOS tiny,完善最基礎(chǔ)的實(shí)驗(yàn)。
1、EVB_MX+簡(jiǎn)介
EVB_MX+
使用STM32L431RCT6作為主控,支持傳感器擴(kuò)展E53接口、支持網(wǎng)絡(luò)模塊擴(kuò)展WAN接口、具有豐富的擴(kuò)展接口等等。騰訊TencentOS tiny 團(tuán)隊(duì)聯(lián)合南京厚德物聯(lián)網(wǎng)有限公司在這個(gè)板子上花費(fèi)了不少心血,參考資料可謂是相當(dāng)完善,零基礎(chǔ)小白看著騰訊的開(kāi)源文檔都能實(shí)現(xiàn)手把手移植TencentOS tiny
到相關(guān)平臺(tái),手把手上手TencentOS tiny
,據(jù)說(shuō)移植TencentOS tiny
到STM32相當(dāng)容易噢!
EVB_MX+開(kāi)發(fā)板資源如下:
2、EVB_LX簡(jiǎn)介
EVB_LX
使用GD32VF103RBT6
作為主控,一樣和EVB_MX+
支持傳感器擴(kuò)展E53接口、支持網(wǎng)絡(luò)模塊擴(kuò)展WAN接口、具有豐富的擴(kuò)展接口等等。這是TencentOS tiny 團(tuán)隊(duì)聯(lián)合兆易創(chuàng)新(GD32)、南京厚德物聯(lián)網(wǎng)有限公司三方合作設(shè)計(jì)的一款物聯(lián)網(wǎng)評(píng)估板,用于TencentOS tiny 基礎(chǔ)內(nèi)核、RISC-V新IP核架構(gòu)和IoT組件功能體驗(yàn)和評(píng)估。
近年來(lái),隨著國(guó)際形勢(shì)日益嚴(yán)峻,國(guó)產(chǎn)半導(dǎo)體行業(yè)也在不斷崛起,而兆易創(chuàng)新可謂是芯片國(guó)產(chǎn)化的急行軍,它快速借鑒國(guó)內(nèi)以及國(guó)外的優(yōu)勢(shì)資源,吸取教訓(xùn),不斷完善自己的生態(tài)鏈。在國(guó)內(nèi)已經(jīng)有不少的廠(chǎng)家開(kāi)始用上了兆易的芯片做了很多成熟穩(wěn)定的產(chǎn)品,特別是在工控行業(yè),兆易32位芯片逐步取代國(guó)外32位主流控制芯片,相信有朝一日定能與國(guó)外的半導(dǎo)體行業(yè)一較高下,成為未來(lái)芯片設(shè)計(jì)領(lǐng)域的佼佼者!
那么移植一個(gè)TencentOS tiny
到開(kāi)發(fā)板上真的有那么簡(jiǎn)單嗎?我們以將TencentOS tiny
移植到EVB_MX+
為例。
EVB_LX開(kāi)發(fā)板資源如下:
3、TencentOS tiny EVB_MX+初體驗(yàn)
3.1、準(zhǔn)備一份裸機(jī)工程
以下是我配置的LED、按鍵、時(shí)鐘、串口、SWD調(diào)試口的裸機(jī)工程,這里我們直接借助STM32CubeMX生成就好了:
(1)配置LED、按鍵
(2)配置時(shí)鐘
(3)配置串行調(diào)試口
(4)配置調(diào)試串口
(5)生成基礎(chǔ)裸機(jī)工程
設(shè)置外設(shè)以單獨(dú)的文件生成
最后點(diǎn)擊生成代碼即可,我是屬于Keil環(huán)境下進(jìn)行開(kāi)發(fā)。
3.2、移植TencentOS tiny到EVB_MX+
TencentOS tiny整體架構(gòu)
從TencentOS tiny開(kāi)源的Github或者碼云倉(cāng)庫(kù)下載整個(gè)SDK包,如下所示:
TencentOS tiny
?Github倉(cāng)庫(kù)地址:
https://github.com/Tencent/TencentOS-tiny
TencentOS tiny參考文檔地址:
https://cloud.tencent.com/document/product/1098
首先我們重新在別的地方創(chuàng)建一個(gè)TencentOS tiny,然后把我們下載到的包里的arch、board、kernel、osal四個(gè)文件夾拷貝出來(lái)放到我們新創(chuàng)建的TencentOS tiny文件夾,最后我們?cè)偈謩?dòng)創(chuàng)建一個(gè)TOS_CONFIG,用于放置TencentOS tiny的配置文件,效果如下:
接下來(lái)我們把剛剛創(chuàng)建好的裸機(jī)工程First_Test放到board文件夾下:
一級(jí)目錄 | 二級(jí)目錄 | 說(shuō)明 |
---|---|---|
arch | arm | TencentOS tiny適配的IP核架構(gòu)(含M核中斷、調(diào)度、tick相關(guān)代碼) |
board | First_Test | 移植目標(biāo)芯片的工程文件 |
kernel | core | TencentOS tiny內(nèi)核源碼 |
pm | TencentOS tiny低功耗模塊源碼 | |
osal | cmsis_os | TencentOS tiny提供的cmsis os 適配 |
這時(shí)候我們的目錄架構(gòu)如上所示,打開(kāi)First_Test的Keil MDK工程。
(1)添加工程文件
以上需要選擇對(duì)應(yīng)芯片架構(gòu),詳細(xì)請(qǐng)參考10.Porting_Manual_for_KEIL.md
文檔說(shuō)明,如果SDK包沒(méi)有的話(huà)則需要自己去移植。
最后可以看到相關(guān)文件已經(jīng)包含進(jìn)來(lái)了:
(2)添加文件路徑
這里要注意的是需要添加對(duì)應(yīng)芯片架構(gòu)的頭文件,詳細(xì)請(qǐng)參考10.Porting_Manual_for_KEIL.md
文檔說(shuō)明。
(3)添加相關(guān)代碼
打開(kāi)stm32l4xx_it.c,包含tos_k.h頭文件:
在PendSV_Handler前加上__weak關(guān)鍵字,因?yàn)镻endSV_Handler已經(jīng)在TencentOS tiny中某些文件重新實(shí)現(xiàn)了。
__weak?void?PendSV_Handler(void)
{
????/*?USER?CODE?BEGIN?PendSV_IRQn?0?*/
????/*?USER?CODE?END?PendSV_IRQn?0?*/
????/*?USER?CODE?BEGIN?PendSV_IRQn?1?*/
????/*?USER?CODE?END?PendSV_IRQn?1?*/
}
在SysTick_Handler函數(shù)中添加TencentOS tiny的調(diào)度處理函數(shù)在SysTick_Handler函數(shù)中添加TencentOS tiny的調(diào)度處理邏輯:
/**
??*?@brief?This?function?handles?System?tick?timer.
??*/
void?SysTick_Handler(void)
{
????/*?USER?CODE?BEGIN?SysTick_IRQn?0?*/
????/*?USER?CODE?END?SysTick_IRQn?0?*/
????HAL_IncTick();
????/*?USER?CODE?BEGIN?SysTick_IRQn?1?*/
????if(tos_knl_is_running())
????{
????????tos_knl_irq_enter();
????????tos_tick_handler();
????????tos_knl_irq_leave();
????}
????/*?USER?CODE?END?SysTick_IRQn?1?*/
}
以上這里有幾個(gè)關(guān)鍵的API的含義在官方文檔中可以查詢(xún)到:
tos_tick_handler是系統(tǒng)用于更新時(shí)基用的,源碼如下:
__API__?void?tos_tick_handler(void)
{
????if?(unlikely(!tos_knl_is_running()))?{
????????return;
????}
????tick_update((k_tick_t)1u);
#if?TOS_CFG_TIMER_EN?>?0u?&&?TOS_CFG_TIMER_AS_PROC?>?0u
????timer_update();
#endif
#if?TOS_CFG_ROUND_ROBIN_EN?>?0u
????robin_sched(k_curr_task->prio);
#endif
}
這里首先會(huì)判斷內(nèi)核是否已經(jīng)運(yùn)行,如果沒(méi)有運(yùn)行則返回,如果運(yùn)行了,那么就調(diào)用tick_update
更新系統(tǒng)時(shí)基,如果配置了TOS_CFG_TIMER_EN
宏,則調(diào)用timer_update();
這樣我們就可以使用TencentOS Tiny的軟件定時(shí)器,如果配置了TOS_CFG_TIMER_AS_PROC
宏,那么會(huì)進(jìn)行時(shí)間片相關(guān)的邏輯處理,相關(guān)的代碼邏輯大家可以閱讀源碼詳細(xì)分析,不得不說(shuō)TencentOS Tiny這里的保護(hù)做得非常好,設(shè)計(jì)思路很?chē)?yán)謹(jǐn)!
(4)添加OS配置文件
這個(gè)文件一般是手動(dòng)創(chuàng)建的,放在上面我們創(chuàng)建的TOS_CONFIG目錄下,配置對(duì)應(yīng)的宏可以開(kāi)啟OS對(duì)應(yīng)的功能,以下是官方給出的一個(gè)標(biāo)準(zhǔn)模板,如果還有別的需要添加的話(huà),則需要修改以下文件。
tos_config.h
#ifndef?_TOS_CONFIG_H_
#define??_TOS_CONFIG_H_
//#include?"stm32l0xx.h"?//?目標(biāo)芯片頭文件,用戶(hù)需要根據(jù)情況更改
#include?"stm32l4xx_hal.h"
#define?TOS_CFG_TASK_PRIO_MAX???????????10u??//?配置TencentOS?tiny默認(rèn)支持的最大優(yōu)先級(jí)數(shù)量
#define?TOS_CFG_ROUND_ROBIN_EN??????????0u??//?配置TencentOS?tiny的內(nèi)核是否開(kāi)啟時(shí)間片輪轉(zhuǎn)
#define?TOS_CFG_OBJECT_VERIFY_EN???????????1u?//?配置TencentOS?tiny是否校驗(yàn)指針合法
#define?TOS_CFG_TASK_DYNAMIC_CREATE_EN??1u??//?TencentOS?tiny?動(dòng)態(tài)任務(wù)創(chuàng)建功能宏
#define?TOS_CFG_EVENT_EN????????????????1u??//?TencentOS?tiny?事件模塊功能宏
#define?TOS_CFG_MMBLK_EN????????????????1u??//配置TencentOS?tiny是否開(kāi)啟內(nèi)存塊管理模塊
#define?TOS_CFG_MMHEAP_EN???????????????1u??//配置TencentOS?tiny是否開(kāi)啟動(dòng)態(tài)內(nèi)存模塊
#define?TOS_CFG_MMHEAP_DEFAULT_POOL_EN??1u??//?TencentOS?tiny?默認(rèn)動(dòng)態(tài)內(nèi)存池功能宏
#define?TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE????????0x100?//?配置TencentOS?tiny默認(rèn)動(dòng)態(tài)內(nèi)存池大小
#define?TOS_CFG_MUTEX_EN????????????????1u??//?配置TencentOS?tiny是否開(kāi)啟互斥鎖模塊
#define?TOS_CFG_MESSAGE_QUEUE_EN????????1u??//?配置TencentOS?tiny是否開(kāi)啟消息隊(duì)列模塊
#define?TOS_CFG_MAIL_QUEUE_EN???????????1u??//?配置TencentOS?tiny是否開(kāi)啟消息郵箱模塊
#define?TOS_CFG_PRIORITY_MESSAGE_QUEUE_EN?1u?//?配置TencentOS?tiny是否開(kāi)啟優(yōu)先級(jí)消息隊(duì)列模塊
#define?TOS_CFG_PRIORITY_MAIL_QUEUE_EN?1u??//?配置TencentOS?tiny是否開(kāi)啟優(yōu)先級(jí)消息郵箱模塊
#define?TOS_CFG_TIMER_EN????????????????1u??//?配置TencentOS?tiny是否開(kāi)啟軟件定時(shí)器模塊
#define?TOS_CFG_PWR_MGR_EN??????????????0u??//?配置TencentOS?tiny是否開(kāi)啟外設(shè)電源管理模塊
#define?TOS_CFG_TICKLESS_EN?????????????0u??//?配置Tickless?低功耗模塊開(kāi)關(guān)
#define?TOS_CFG_SEM_EN??????????????????1u??//?配置TencentOS?tiny是否開(kāi)啟信號(hào)量模塊
#define?TOS_CFG_TASK_STACK_DRAUGHT_DEPTH_DETACT_EN??????1u?//?配置TencentOS?tiny是否開(kāi)啟任務(wù)棧深度檢測(cè)
#define?TOS_CFG_FAULT_BACKTRACE_EN??????0u??//?配置TencentOS?tiny是否開(kāi)啟異常?;厮莨δ?/span>
#define?TOS_CFG_IDLE_TASK_STK_SIZE??????128u?//?配置TencentOS?tiny空閑任務(wù)棧大小
#define?TOS_CFG_CPU_TICK_PER_SECOND?????1000u?//?配置TencentOS?tiny的tick頻率
#define?TOS_CFG_CPU_CLOCK???????????????(SystemCoreClock)?//?配置TencentOS?tiny?CPU頻率
#define?TOS_CFG_TIMER_AS_PROC???????????1u??//?配置是否將TIMER配置成函數(shù)模式
#endif
到這里,TencentOS Tiny就已經(jīng)在EVB_MX+上移植成功了!接下來(lái)我們來(lái)測(cè)試一下:
(5)添加相關(guān)代碼
在main.c中添加相關(guān)代碼:
#include?"cmsis_os.h"
//定義一個(gè)任務(wù)
#define?TASK1_STK_SIZE??256
void?task1(void?*pdata);
osThreadDef(task1,?osPriorityNormal,?1,?TASK1_STK_SIZE);
void?task1(void?*pdata)
{
????while(1)
????{
????????printf("Hello?TencentOS_tiny_EVB_MX_Plus\n");
????????HAL_GPIO_TogglePin(DEBUG_LED_GPIO_Port,?DEBUG_LED_Pin);
????????osDelay(500);
????}
}
/**
??*?@brief??The?application?entry?point.
??*?@retval?int
??*/
int?main(void)
{
????/*?USER?CODE?BEGIN?1?*/
????/*?USER?CODE?END?1?*/
????/*?MCU?Configuration--------------------------------------------------------*/
????/*?Reset?of?all?peripherals,?Initializes?the?Flash?interface?and?the?Systick.?*/
????HAL_Init();
????/*?USER?CODE?BEGIN?Init?*/
????/*?USER?CODE?END?Init?*/
????/*?Configure?the?system?clock?*/
????SystemClock_Config();
????/*?USER?CODE?BEGIN?SysInit?*/
????/*?USER?CODE?END?SysInit?*/
????/*?Initialize?all?configured?peripherals?*/
????MX_GPIO_Init();
????MX_USART2_UART_Init();
????/*?USER?CODE?BEGIN?2?*/
????//初始化內(nèi)核
????osKernelInitialize();?
????//創(chuàng)建一個(gè)任務(wù)
????osThreadCreate(osThread(task1),?NULL);
????//啟動(dòng)內(nèi)核
????osKernelStart();
????/*?USER?CODE?END?2?*/
????/*?Infinite?loop?*/
????/*?USER?CODE?BEGIN?WHILE?*/
????while?(1)
????{
????????/*?USER?CODE?END?WHILE?*/
????????/*?USER?CODE?BEGIN?3?*/
????}
????/*?USER?CODE?END?3?*/
}
運(yùn)行結(jié)果:
LED調(diào)試燈翻轉(zhuǎn)的同時(shí)打印LOG信息。
有關(guān)TencentOS tiny相關(guān)的知識(shí),小伙伴們可以自行下載SDK包,TencentOS tiny技術(shù)團(tuán)隊(duì)已經(jīng)給多個(gè)開(kāi)發(fā)板編寫(xiě)了相應(yīng)的高質(zhì)量軟件例程。相信有不少東西值得學(xué)習(xí)和借鑒。
公眾號(hào)粉絲福利時(shí)刻
這里我給大家申請(qǐng)到了福利,本公眾號(hào)讀者購(gòu)買(mǎi)小熊派開(kāi)發(fā)板可享受9折優(yōu)惠,有需要購(gòu)買(mǎi)小熊派以及騰訊物聯(lián)網(wǎng)開(kāi)發(fā)板的朋友,淘寶搜索即可,跟客服說(shuō)你是公眾號(hào):嵌入式云IOT技術(shù)圈 的粉絲,立享9折優(yōu)惠!
往期精彩
網(wǎng)紅物聯(lián)網(wǎng)開(kāi)發(fā)板小熊派使用評(píng)測(cè)
開(kāi)源STM32產(chǎn)品:無(wú)線(xiàn)點(diǎn)菜寶使用評(píng)測(cè)
替代傳統(tǒng)串口屏的Yoxios了解一下!
了解下小白的福音Micro-Lab(多個(gè)案例帶你快速入門(mén))
覺(jué)得本次分享的文章對(duì)您有幫助,隨手點(diǎn)[在看]
并轉(zhuǎn)發(fā)分享,也是對(duì)我的支持。
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀(guān)點(diǎn),不代表本平臺(tái)立場(chǎng),如有問(wèn)題,請(qǐng)聯(lián)系我們,謝謝!