基于裸机工程移植内核
基于裸機工程移植內核
在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-v7m | common | TencentOS tiny 中斷tick相關代碼 | 
| arch\arm\arm-v7m | cortex-m7\gcc | TencentOS Tiny M核調度匯編 GCC | 
| kernel | core | TencentOS tiny內核源碼 | 
| hal | TencentOS tiny驅動抽象層 | |
| pm | TencentOS tiny低功耗源碼 | |
| TOS_CONFIG | TencentOS 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 #endif7.編譯下載測試
編譯完成下載到開發板,通過串口助手我們可以看到兩個任務交替運行,打印task信息,說明內核移植成功,如下圖所示:
 
引用官方例程
下載源碼包后有這樣一個文件夾,里面都是官方給的一些例程,無論我們是學習還是開發對我們都會有很大的幫助,下面我舉例示范一下如何引用
 
 在這我選擇簡單的hello_world例程作為示范。有其他問題大家評論區討論。
 
 首先把例程拷貝到工程目錄下,回到MCUXpresso按F5刷新
 
 打開例程我們看一下代碼,例程中有一個函數的總入口,我們只需要在main函數中調用這個任務即可。
 
 第一步:配置任務的參數
第二步:初始化、創建、啟動
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();//啟動內核好了,下一步我們要開始準備上網了。
總結
以上是生活随笔為你收集整理的基于裸机工程移植内核的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 关于可重定位目标文件的格式与其符号表的概
 - 下一篇: Viso画图之 -- 平行四边形