基于裸机工程移植内核
基于裸机工程移植内核
在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();//启动内核
好了,下一步我们要开始准备上网了。
基于裸机工程移植内核相关推荐
- DW1000开发笔记(三)基于STM32 HAL库裸机工程移植DW1000官方驱动
系列文章 DW1000开发笔记(一)DW1000芯片概览 DW1000开发笔记(二)使用STM32硬件SPI+STM32cubeMX+HAL库测试DW1000通信 一.官方驱动 Decawave官方提 ...
- ccs 移植创建新工程_LiteOS裸机驱动移植05 | E53_SF1智慧消防扩展板驱动及使用
(小熊派IoT开发套件全部教程 ↑点击启阅↑) ▷01 | 物联网一站式开发工具 IoT-Studio ▷02 | Hello World ▷03 | 任务管理 ▷04 | 信号量(任务同步) ▷ ...
- [转载]基于ARM的linux内核裁剪与移植
基于ARM的linux内核裁剪与移植 http://bbs.elecfans.com/forum.php?mod=viewthread&tid=185020 wutaimin( 楼主 ) 2 ...
- 基于2.6.35内核的无线网卡驱动的移植
基于2.6.35内核的无线网卡驱动的移植 一. 移植环境: [移植环境] 1.主机:Ubuntu 10.10 2.目标机:FS210平台 3.交叉编译工 ...
- linux内核wifi驱动,基于2.6.35内核的SDIO-WiFi驱动移植
一. 移植环境 [移植环境] 1. 主机:Ubuntu 10.10发行版 2. 目标机:FS_S5PC100平台 3. 交叉编译工具:arm-none-linux-gnueabi-4.5.1 4.wi ...
- 基于 Keil MDK 移植 RT-Thread Nano RTOS到华大半导体HC32F030J8TA
<<<<<正文>>>>> 作者:李彬彬 时间:2021/12/20 微信公众号:airX嵌入式 公司项目合作联系方式:公众号留言/微信159 ...
- 单片机 STM32F103C8T6 cubeMX HAL库 从环境到开发 正点原子工程移植 freeRTOS
文章目录 0 准备材料 1 闪烁PC13的小灯 2 正点原子工程移植 注意点以及细节 3 freeRTOS 3.1 LED KEY 串口1 的一个实验 0 准备材料 1.需要正点原子的HAL介绍书籍可 ...
- 基于CubeMX-STM32F302_uCOSII例程移植
基于CubeMX-STM32F302_uCOSII例程移植 1.说明 STM32F302的内核为Cortex-M4的,所以我们以官方的F4例程为基础移植. 2.准备 2.1.软件 1.官方例程源码:M ...
- uIP无操作系统(裸机)移植
本文转自music_fong博客:http://blog.csdn.net/music_fong/article/details/7191773 以前自己写了一个TCP/IP的协议栈,但是需要的48K ...
最新文章
- 机器学习科研的十年,希望让你少走一些坑
- 自己看着视频的理解:设计模式之abstractfactory模式(2)
- 快速向服务器传文件格式,客户端如何向服务器传文件格式
- powershell写mysql_使用Powershell对MySql运行MySql存储过程脚本
- 用 Python 爬取了 14 年的福彩 3D 信息!彩民们,只能帮你们到这了
- pd虚拟机镜像:懒人一键安装win10、11
- 个人记账系统c语言,C#实现_______个人记账程序
- 8.高等数学-两个重要的极限定理
- android service设置persistent,Persistent service
- python colorsys模块 RGB和其他色彩系统(颜色空间)(YIQ、HLS、HSV)之间的转换 hsv_to_rgb(h, s, v)函数
- OC load 和 initialize 方法
- 建立内网Windows补丁服务器
- Qgis教程12:动态展示
- 2018校招携程测评,赞RP
- JVM上篇(13):GC分类器
- linux文件重命名命令
- redis---incr命令
- 解决无法使用localhost连接数据库,使用服务器IP可以
- python的海龟绘图
- 基频和倍频的概念_一倍频分析