基于裸机工程移植内核
基于裸机工程移植内核
在TencentOS Tiny官方项目仓下载内核代码,下载地址:
https://github.com/OpenAtomFoundation/TencentOS-tiny
下载会很慢,在这分享一下我的微云链接:https://share.weiyun.com/iNSdPrD4
拷贝如下目录的内核代码到workspace工程目录下的source文件夹下,然后回到IDE按F5刷新即可(请不要拷贝多余的文件,微云链接不需要修改)
目录 | 文件 | 说明 |
---|---|---|
archarmarm-v7m | common | TencentOS tiny 中断tick相关代码 |
archarmarm-v7m | cortex-m7gcc | 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 task1rn");
tos_task_delay(2000);
}
}
void task2_entry(void *arg)
{
while (1) {
PRINTF("***I am task2rn");
tos_task_delay(1000);
}
}
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("rn GPIO Driver examplern");
PRINTF("rn Welcome to TencentOS Tiny!rn");
/* 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(&task1, "task1", task1_entry, NULL, 4, task1_stk, TASK1_STK_SIZE, 0); // Create task1
tos_task_create(&task2, "task2", task2_entry, NULL, 3, task2_stk, TASK2_STK_SIZE, 0);// Create task2
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信息,说明内核移植成功,如下图所示: