基于裸机工程移植内核

在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      #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();//启动内核

好了,下一步我们要开始准备上网了。

基于裸机工程移植内核相关推荐

  1. DW1000开发笔记(三)基于STM32 HAL库裸机工程移植DW1000官方驱动

    系列文章 DW1000开发笔记(一)DW1000芯片概览 DW1000开发笔记(二)使用STM32硬件SPI+STM32cubeMX+HAL库测试DW1000通信 一.官方驱动 Decawave官方提 ...

  2. ccs 移植创建新工程_LiteOS裸机驱动移植05 | E53_SF1智慧消防扩展板驱动及使用

    (小熊派IoT开发套件全部教程   ↑点击启阅↑) ▷01 | 物联网一站式开发工具 IoT-Studio ▷02 | Hello World ▷03 | 任务管理 ▷04 | 信号量(任务同步) ▷ ...

  3. [转载]基于ARM的linux内核裁剪与移植

    基于ARM的linux内核裁剪与移植 http://bbs.elecfans.com/forum.php?mod=viewthread&tid=185020  wutaimin( 楼主 ) 2 ...

  4. 基于2.6.35内核的无线网卡驱动的移植

    基于2.6.35内核的无线网卡驱动的移植 一. 移植环境: [移植环境]         1.主机:Ubuntu 10.10         2.目标机:FS210平台         3.交叉编译工 ...

  5. linux内核wifi驱动,基于2.6.35内核的SDIO-WiFi驱动移植

    一. 移植环境 [移植环境] 1. 主机:Ubuntu 10.10发行版 2. 目标机:FS_S5PC100平台 3. 交叉编译工具:arm-none-linux-gnueabi-4.5.1 4.wi ...

  6. 基于 Keil MDK 移植 RT-Thread Nano RTOS到华大半导体HC32F030J8TA

    <<<<<正文>>>>> 作者:李彬彬 时间:2021/12/20 微信公众号:airX嵌入式 公司项目合作联系方式:公众号留言/微信159 ...

  7. 单片机 STM32F103C8T6 cubeMX HAL库 从环境到开发 正点原子工程移植 freeRTOS

    文章目录 0 准备材料 1 闪烁PC13的小灯 2 正点原子工程移植 注意点以及细节 3 freeRTOS 3.1 LED KEY 串口1 的一个实验 0 准备材料 1.需要正点原子的HAL介绍书籍可 ...

  8. 基于CubeMX-STM32F302_uCOSII例程移植

    基于CubeMX-STM32F302_uCOSII例程移植 1.说明 STM32F302的内核为Cortex-M4的,所以我们以官方的F4例程为基础移植. 2.准备 2.1.软件 1.官方例程源码:M ...

  9. uIP无操作系统(裸机)移植

    本文转自music_fong博客:http://blog.csdn.net/music_fong/article/details/7191773 以前自己写了一个TCP/IP的协议栈,但是需要的48K ...

最新文章

  1. 机器学习科研的十年,希望让你少走一些坑
  2. 自己看着视频的理解:设计模式之abstractfactory模式(2)
  3. 快速向服务器传文件格式,客户端如何向服务器传文件格式
  4. powershell写mysql_使用Powershell对MySql运行MySql存储过程脚本
  5. 用 Python 爬取了 14 年的福彩 3D 信息!彩民们,只能帮你们到这了
  6. pd虚拟机镜像:懒人一键安装win10、11
  7. 个人记账系统c语言,C#实现_______个人记账程序
  8. 8.高等数学-两个重要的极限定理
  9. android service设置persistent,Persistent service
  10. python colorsys模块 RGB和其他色彩系统(颜色空间)(YIQ、HLS、HSV)之间的转换 hsv_to_rgb(h, s, v)函数
  11. OC load 和 initialize 方法
  12. 建立内网Windows补丁服务器
  13. Qgis教程12:动态展示
  14. 2018校招携程测评,赞RP
  15. JVM上篇(13):GC分类器
  16. linux文件重命名命令
  17. redis---incr命令
  18. 解决无法使用localhost连接数据库,使用服务器IP可以
  19. python的海龟绘图
  20. 基频和倍频的概念_一倍频分析

热门文章

  1. js时间字符串比较大小
  2. 一个失败的知识管理案例分析
  3. oracle 位图索引 原理,数据库教程:Oracle 位图索引叙述
  4. pycharm没有找到manage repositories按钮解决方案
  5. nextSibling和nextElementSilbing使用以及解决兼容性问题
  6. VS2013安装 图文教程
  7. Android 生成签名文件、配置签名信息、打包
  8. fineui mysql_FineUI配置文件
  9. 2021年六一儿童节,有哪些想送给孩子们的祝福?
  10. 局域网、以太网(标准以太网、工业以太网和实时以太网)与无线局域网