STM32L431使用TencentOS?tiny操作系統(tǒng)連接騰訊物聯(lián)網(wǎng)開發(fā)平臺(tái)
去年騰訊為了宣傳自己針對(duì)物聯(lián)網(wǎng)的開源操作系統(tǒng)TencentOS tiny,舉辦了一場(chǎng)試用活動(dòng),當(dāng)時(shí)幸運(yùn)獲得一塊,但是當(dāng)時(shí)公司任務(wù)較重,一直吃灰。
板子實(shí)物就這樣,沒啥好介紹的,都是基礎(chǔ)的外設(shè),如今閑來無事,再加上眾多大神完善了git庫,使開發(fā)變得容易,所以索性掏出來玩一下。這次主要實(shí)現(xiàn)以下幾個(gè)功能:
在騰訊物聯(lián)網(wǎng)平臺(tái)創(chuàng)建項(xiàng)目和產(chǎn)品(此處為智能燈)
通過平臺(tái)控制燈
使用騰訊連連微信小程序控制燈
一.上手體驗(yàn)helloworld
騰訊物聯(lián)網(wǎng)終端操作系統(tǒng) TencentOS tiny 簡(jiǎn)介
騰訊物聯(lián)網(wǎng)終端操作系統(tǒng)(TencentOS tiny)是騰訊面向物聯(lián)網(wǎng)領(lǐng)域開發(fā)的實(shí)時(shí)操作系統(tǒng),具有低功耗,低資源占用,模塊化,安全可靠等特點(diǎn),可有效提升物聯(lián)網(wǎng)終端產(chǎn)品開發(fā)效率。TencentOS tiny 提供精簡(jiǎn)的 RTOS 內(nèi)核,內(nèi)核組件可裁剪可配置,可快速移植到多種主流 MCU 及模組芯片上。而且,基于RTOS內(nèi)核提供了豐富的物聯(lián)網(wǎng)組件,內(nèi)部集成主流物聯(lián)網(wǎng)協(xié)議棧(如 CoAP/MQTT/TLS/DTLS/LoRaWAN/NB-IoT 等),可助力物聯(lián)網(wǎng)終端設(shè)備及業(yè)務(wù)快速接入騰訊云物聯(lián)網(wǎng)平臺(tái)。
這是來源于官網(wǎng)的介紹,到底好不好還得看使用,對(duì)于我們新手,直接從源碼開始,方便體驗(yàn)上手:TencentOS_ting源碼倉庫。
從倉庫拉取下來后文件夾目錄如下:
這里簡(jiǎn)單介紹幾個(gè)主要的文件夾:
board文件夾這個(gè)文件夾中包含了目前為止TencentOS tiny 適配的開發(fā)板合集,在測(cè)試學(xué)習(xí)的時(shí)候非常好用,基本上熱門的開發(fā)板均有適配。如果自己適配了新的開發(fā)板可以在開發(fā)完成后提交合并上去,為后續(xù)的開發(fā)者提供便利,到手即用。目前已適配很多。
device文件夾
該文件夾為TencentOS tiny支持的通信模組,包括了NB-IOT,wifi,2G,4G,lora。基本滿足開發(fā)需求,使用很方便。
components文件夾
組件文件夾,包括上云組件,文件系統(tǒng),安全組件,其中上云組件集合了各種常用的上云方式:
測(cè)試第一個(gè)代碼:
根據(jù)自己的開發(fā)板在encentOS-tiny\board文件夾下尋找相對(duì)應(yīng)的開發(fā)板,我這里選擇TencentOS_tiny_EVB_MX_Plus,進(jìn)入文件夾,打開KEIL文件,打開hello_world工程。
工程結(jié)構(gòu):
主函數(shù)中初始化了開發(fā)板的外設(shè)和任務(wù)的創(chuàng)建啟動(dòng)
board_init();初始化了系統(tǒng)的時(shí)鐘,UART,定時(shí)器和OLED的顯示,所以編譯燒錄后可以在屏幕上顯示相關(guān)信息。
hello_world.c文件主要是創(chuàng)建任務(wù),以及任務(wù)之間的調(diào)用??梢栽诖谟^察任務(wù)運(yùn)行情況
#define?TASK1_STK_SIZE??????????1024void task1(void *arg);osThreadDef(task1, osPriorityNormal, 1, TASK1_STK_SIZE);#define TASK2_STK_SIZE 1024void task2(void *arg);osThreadDef(task2, osPriorityNormal, 1, TASK2_STK_SIZE);#if TOS_CFG_TASK_DYNAMIC_CREATE_EN > 0u#define TASK3_STK_SIZE 512void task3(void *arg);#endifvoid task1(void *arg){#if TOS_CFG_TASK_DYNAMIC_CREATE_EN > 0u osThreadId task_dyn_created; osThreadDynamicDef(task3, osPriorityNormal, 1, TASK3_STK_SIZE); task_dyn_created = osThreadCreate(osThread(task3), NULL);int count = 0;#endifwhile (1) {printf("###I am task1\r\n"); osDelay(2000);#if TOS_CFG_TASK_DYNAMIC_CREATE_EN > 0uif (count == 3) {printf("###I am task1, kill the task3(dynamic created)\r\n"); osThreadTerminate(task_dyn_created); }#endif }}void task2(void *arg){while (1) {#if TOS_CFG_TASK_STACK_DRAUGHT_DEPTH_DETACT_EN > 0uk_err_t rc;int depth; rc = tos_task_stack_draught_depth(K_NULL,