日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基于裸机工程移植内核

發布時間:2024/1/18 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于裸机工程移植内核 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

基于裸機工程移植內核

在TencentOS Tiny官方項目倉下載內核代碼,下載地址:
GITHUB:https://github.com/OpenAtomFoundation/TencentOS-tiny
Gitee:https://gitee.com/Tencent/TencentOS-tiny
在這分享一下我的微云鏈接:https://share.weiyun.com/iNSdPrD4
拷貝如下目錄的內核代碼到workspace工程目錄下的source文件夾下,然后回到IDE按F5刷新即可(請不要拷貝多余的文件,微云鏈接下載的不需要修改)
其中arch文件夾主要是儲存CPU架構相關匯編程序支持,用于任務調度,kernel文件夾存放內核源碼,TOS_CONFIG 主要存放操作系統抽象層(可選)。

目錄文件說明
arch\arm\arm-v7mcommonTencentOS tiny 中斷tick相關代碼
arch\arm\arm-v7mcortex-m7\gccTencentOS Tiny M核調度匯編 GCC
kernelcoreTencentOS tiny內核源碼
halTencentOS tiny驅動抽象層
pmTencentOS tiny低功耗源碼
TOS_CONFIGTencentOS tiny配置頭文件,用戶自定義,從模板修改過來

接下來,我們在gpio_led_output.c添加TencentOS Tiny內核初始化和相關任務代碼

1.包含內核頭文件 #include “tos_k.h”

2.添加Tick處理函數 SysTick_Handler ,代碼如下:

這里是要讓內核接管中斷,但不是完全接管

void SysTick_Handler(void) {if (tos_knl_is_running())//檢查當前內核是否在運行{tos_knl_irq_enter();//告訴內核要進入中斷tos_tick_handler();//調用系統中斷tos_knl_irq_leave();//告訴內核要退出中斷} }

3. 新建兩個測試任務

文檔版

#define TASK1_STK_SIZE 1024 k_task_t task1; uint8_t task1_stk[TASK1_STK_SIZE];#define TASK2_STK_SIZE 1024 k_task_t task2; uint8_t task2_stk[TASK2_STK_SIZE];void task1_entry(void *arg)//任務入口函數 {while (1) {PRINTF("###I am task1\r\n");tos_task_delay(2000);} }void task2_entry(void *arg) {while (1) {PRINTF("***I am task2\r\n");tos_task_delay(1000);} }

直播版

#define APPLICATION_TASK_STK_SIZE 1024 k_task_t application_task; uint8_t application_task_stk[APPLICATION_TASK_STK_SIZE];void __attribute__((weak)) application_entry(void *arg)//任務入口函數 {while (1) {PRINTF("###I am task1\r\n");tos_task_delay(2000);} }

4.在main函數后面增加操作系統初始化函數

文檔版

int main(void) {/* Define the init structure for the output LED pin*/gpio_pin_config_t led_config = {kGPIO_DigitalOutput, 0, kGPIO_NoIntmode};/* Board pin, clock, debug console init */BOARD_ConfigMPU();BOARD_InitBootPins();BOARD_InitBootClocks();BOARD_InitDebugConsole();/* Print a note to terminal. */PRINTF("\r\n GPIO Driver example\r\n");PRINTF("\r\n Welcome to TencentOS Tiny!\r\n");/* Init output LED GPIO. */GPIO_PinInit(EXAMPLE_LED_GPIO, EXAMPLE_LED_GPIO_PIN, &led_config);tos_knl_init(); // TencentOS Tiny kernel initialize//tos_task_create(任務塊指針,任務名,任務入口函數,入口函數的傳入參數,任務優先級,任務棧大小,時間片參數)//時間片參數只有在開啟時間片是才有用,默認是關的tos_task_create(&task1, "task1", task1_entry, NULL, 4, task1_stk, TASK1_STK_SIZE, 0); // Create task1tos_task_create(&task2, "task2", task2_entry, NULL, 3, task2_stk, TASK2_STK_SIZE, 0);// Create task2tos_knl_start();//啟動調度器,注意:啟動后永不返回,所以后面的代碼都無效}

直播版

int main(void) {k_err_t err;tos_knl_init(); // TencentOS Tiny kernel initialize//tos_task_create(任務塊指針,任務名,任務入口函數,入口函數的傳入參數,任務優先級,任務棧大小,時間片參數)//時間片參數只有在開啟時間片是才有用,默認是關的err=tos_task_create(&application_task, "application_task", application_entry, NULL, 2, application_task_stk, APPLICATION_TASK_STK_SIZE,10); // Create task1if(err!= K_ERR_NONE){PRINTF("task create fail.\r\n");}tos_knl_start();//啟動調度器,注意:啟動后永不返回,所以后面的代碼都無效 }

5. 在工程里面配置TencentOS Tiny 頭文件編譯目錄

6.修改tos_config.h文件

#ifndef _TOS_CONFIG_H_ #define _TOS_CONFIG_H_#include "board.h" // 目標芯片頭文件,用戶需要根據情況更改 // 配置TencentOS tiny默認支持的最大優先級數量 #define TOS_CFG_TASK_PRIO_MAX 10u // 配置TencentOS tiny的內核是否開啟時間片輪轉 #define TOS_CFG_ROUND_ROBIN_EN 0u // 配置TencentOS tiny是否校驗指針合法 #define TOS_CFG_OBJECT_VERIFY_EN 1u // TencentOS tiny 動態任務創建功能宏 #define TOS_CFG_TASK_DYNAMIC_CREATE_EN 1u // TencentOS tiny 事件模塊功能宏 #define TOS_CFG_EVENT_EN 1u //配置TencentOS tiny是否開啟內存塊管理模塊 #define TOS_CFG_MMBLK_EN 1u //配置TencentOS tiny是否開啟動態內存模塊 #define TOS_CFG_MMHEAP_EN 1u // TencentOS tiny 默認動態內存池功能宏 #define TOS_CFG_MMHEAP_DEFAULT_POOL_EN 1u // 配置TencentOS tiny默認動態內存池大小 #define TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE 0x2000 // 配置TencentOS tiny是否開啟互斥鎖模塊 #define TOS_CFG_MUTEX_EN 1u // 配置TencentOS tiny是否開啟消息隊列模塊 #define TOS_CFG_MESSAGE_QUEUE_EN 1u // 配置TencentOS tiny是否開啟消息郵箱模塊 #define TOS_CFG_MAIL_QUEUE_EN 1u // 配置TencentOS tiny是否開啟優先級消息隊列模塊 #define TOS_CFG_PRIORITY_MESSAGE_QUEUE_EN 1u // 配置TencentOS tiny是否開啟優先級消息郵箱模塊 #define TOS_CFG_PRIORITY_MAIL_QUEUE_EN 1u // 配置TencentOS tiny是否開啟軟件定時器模塊 #define TOS_CFG_TIMER_EN 1u // 配置TencentOS tiny是否開啟外設電源管理模塊 #define TOS_CFG_PWR_MGR_EN 0u // 配置Tickless 低功耗模塊開關 #define TOS_CFG_TICKLESS_EN 0u // 配置TencentOS tiny是否開啟信號量模塊 #define TOS_CFG_SEM_EN 1u // 配置TencentOS tiny是否開啟任務棧深度檢測 #define TOS_CFG_TASK_STACK_DRAUGHT_DEPTH_DETACT_EN 1u // 配置TencentOS tiny是否開啟異常棧回溯功能 #define TOS_CFG_FAULT_BACKTRACE_EN 0u // 配置TencentOS tiny空閑任務棧大小 #define TOS_CFG_IDLE_TASK_STK_SIZE 128u // 配置TencentOS tiny的tick頻率 #define TOS_CFG_CPU_TICK_PER_SECOND 1000u // 配置TencentOS tiny CPU頻率 #define TOS_CFG_CPU_CLOCK (SystemCoreClock) // 配置是否將TIMER配置成函數模式 #define TOS_CFG_TIMER_AS_PROC 1u #endif

7.編譯下載測試

編譯完成下載到開發板,通過串口助手我們可以看到兩個任務交替運行,打印task信息,說明內核移植成功,如下圖所示:

引用官方例程

下載源碼包后有這樣一個文件夾,里面都是官方給的一些例程,無論我們是學習還是開發對我們都會有很大的幫助,下面我舉例示范一下如何引用

在這我選擇簡單的hello_world例程作為示范。有其他問題大家評論區討論。

首先把例程拷貝到工程目錄下,回到MCUXpresso按F5刷新

打開例程我們看一下代碼,例程中有一個函數的總入口,我們只需要在main函數中調用這個任務即可。

第一步:配置任務的參數

#define TASK_STK_SIZE 512//任務棧大小 k_task_t application_task; uint8_t application_task_stk[TASK_STK_SIZE];

第二步:初始化、創建、啟動

tos_knl_init();//系統內核初始化err=tos_task_create(&application_task, "application_task", application_entry, NULL, 2, application_task_stk, TASK_STK_SIZE, 10); // Create task1//tos_task_create(任務塊指針,任務名,任務入口函數,入口函數的傳入參數,任務優先級,任務棧大小,時間片參數)if(err != K_ERR_NONE){PRINTF("task create fail.\r\n");} // application_entry();tos_knl_start();//啟動內核

好了,下一步我們要開始準備上網了。

總結

以上是生活随笔為你收集整理的基于裸机工程移植内核的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。