TesegOS单片机实时操作系统

简介

TesegOS面向8位机或32位低端MCU而设计,是一款简单易用,资源利用率高,代码简洁、 易掌握的微型任务调度器。

任务调度策略

TesegOS采用抢占式任务调度策略、已准备好的高优先级任务会通过中断的方式优先得到运行, 相同优先级的任务按准备好时的时间顺序得到执行,同优先等级的任务不会互相抢占。

任务数量

TesegOS中不限制任务数量,最多的任务数量取决于硬件资源。

应用程序示例

	#include "uxos.h"

	ux_stack_t g_Task1Stack[128];
	UX_TCB g_Task1Tcb;
	void Task1(void)
	{
		while(1)
		{
			//...
		}
	}

	ux_stack_t g_Task2Stack[128];
	UX_TCB g_Task2Tcb;
	void Task2(void)
	{
		while(1)
		{
			//...
		}
	}

	int main(void)
	{
		//硬件初始化
		//...
		
		//创建任务及其它内核对象
		uxCreateTask(&g_Task1Tcb,Task1,g_Task1Stack+127,2);
		uxCreateTask(&g_Task2Tcb,Task2,g_Task2Stack+127,2);
		
		uxStart(); //调用此函数后不可再创建任务
		
		//以下的代码作为默认任务(DefaultTask)运行,默认任务有如下特性:
		//1.默认任务在开发环境启动代码配置的堆栈下运行,建议应用程序的主代码在此任务下执行
		//2.默认任务的优先级为 1,仅高于空闲任务

		while(1)
		{
			//...
		}
	}

	//空闲任务(IDLE)执行函数,空闲任务有如下特性:
	//1.空闲任务中不可调用等待信号,延时等使系统切换任务的api函数
	//2.空闲任务优先级为最低(值为0)
	//3.系统具有默认的空闲任务执行函数,当不需要时可删除此函数
	void IdleTask(void)
	{
		while(1)
		{
			//...
		}
	}	
	

任务管理接口

任务需要在入口函数(main)中创建,必须在调用uxStart前创建好
TesegOS内置两个特殊任务DefaultTask和IdleTask

默认任务DefaultTask
DefaultTask即是入口函数(main)执行的内容,为此main函数的最后必须是个 无限循环(不可退出),DefaultTask使用的是开发环境启动代码配置的堆栈, 通常这是最不易溢出的情况,在有限RAM资源的MCU来说这是安全利用RAM资源 很有效的方式。

空闲任务IdleTask
IdleTask在系统内核中创建,用于在调度器发现没有其它准备好的任务时执行, IdleTask的执行函数在系统内核中已定义,但用户可在应用中重写来执行CPU空闲时 的非重要任务,但需要注意的是,IdleTask中试图切换任务可导致系统崩溃, 为此IdleTask中不可调用系统提供的等待、延时等导致主动放弃CPU执行权的api函数。

任务优先级
TesegOS任务优先级可设置范围是0~255,数值越高优先级越高。DefaultTask的优先级为1 IdleTask任务的优先级为0,如果用户创建的任务优先级为0,就会导致无法得到cpu执行 权的情况,因为同样0优先级的IdleTask任务永远不会主动放弃cpu执行权。所以 一般用户新建任务使用的优先级为2,3,4…等。

接口函数:

创建一个任务

void uxCreateTask 
(
PUX_TCB pTCB, 
void(*)(void) fn, 
ux_stack_t * stack, 
uint8_t priority 
)

参数
pTCB 任务对象
fn 任务执行函数,原型为 void xxx(void)
stack 任务堆栈在RAM中的位置
priority 优先级(1~255)

当前任务延时

void uxDelayTask (uint16_t n)

参数
n 延时的系统滴答周期

系统开始运行

void uxStart (void )

注解:一般在入口函数(main)中调用,在调用前创建任务,调用后不可再创建任何任务

信号量

信号量是在两个或多个任务请求多个资源时提供分配和等待机制。
提供4个接口函数:

无等待的请求信号量

#define uxAcceptSem(X)

参数
X:指向信号量对象指针
返回
UXC_DONE:表示为本次请求释放了一个信号 UXC_PEND:无可释放信号 UXC_WAIT:有其它任务也在等待此信号量

创建一个系统信号量

#define uxCreateSem(X, Y )

参数
X 指向信号量对象指针
Y 可同时执行的任务个数

请求一个信号量

#define uxPendSem(X)

参数
X 指向信号量对象指针

向信号量释放一个请求权限

#define uxPostSem(X)

参数
X 指向信号量对象指针

互斥量

互斥量是在两个或多个任务请求一个资源时提供分配和等待机制。
提供3个接口函数:

创建一个系统互斥量

#define uxCreateMutex(X)

参数
X 指向互斥量对象指针

锁定一个互斥量

#define uxLockMutex(X)

参数
X 指向互斥量对象指针

解锁(释放)一个互斥量

#define uxUnlockMutex(X)

参数
X 指向互斥量对象指针

事件

xos中事件是两个任务间同步的一种机制,事件具有等待超时功能, 但等待事件的任务只能为一个。
提供3个接口函数:

创建一个系统事件

#define uxCreateEvent(X)

参数
X 指向事件对象指针

触发一个事件

#define uxSetEvent(X)

参数
X 指向事件对象指针

等待一个事件对象

#define uxWaitEvent(X, Y )

参数
X 指向事件对象指针
Y 超时系统滴答数
返回 : 事件触发原因,非零表示超时触发,零表示正常触发动作而返回

系统移植

以移植到cortex-m0为例需要实现如下五点:
1.任务主动放弃CPU执行权进行任务切换:
osSched函数在任务调用uxDelayTask,uxWaitEvent,uxLockMutex,uxPendSem进入一个等待状态时调用 此函数进行任务切换。在Cortex-M0中osSched函数的实现非常简单,只需要触发一个PendSV中断即可。
2.任务被更高优先级任务抢占cpu执行板时进行任务切换:
osSchedFromISR函数所有的抢占操作均是在系统滴答中断中完成的,osSchedFromISR实现步骤如下:
osTickHandler(); 判断有无任务切换,有无更高优先级任务就绪,如果有触发PendSV中断 双堆栈+软件中断方式切换任务优势体现在这里,系统滴答中断中不必每次存储和恢复任务环境, 这大大的提高了系统运行效率。压缩了系统对CPU的占用率。
3.任务堆栈初始化函数
这是一个模拟切换任务时压栈当前环境的函数,把任务的初始栈内容准备好,以便切换到此任务时从栈弹出 任务的运行环境。
ux_stack_t * osTaskStackInit(ux_stack_t *stack,void (*fn)(void) ) //任务的堆栈初始化
4.PendSV中断
完成实际的任务的切换
5.系统滴答功能初始化
osSysTickStart系统滴答中断硬件初始化在此函数内实现,通常系统滴答中断周期设置成10~20毫秒。
对于具有双堆栈指针的arm内核这里要多做一件事情,TesegOS将main函数视作default任务,系统上电后main函数是用msp执行, 此时可视为系统模式,而执行到这里需要做一个身份的转换,即要变成一个普通的任务,就是要将msp交给系统(中断时用),而 自己切换到psp模式。

配置并开启系统滴答定时器 SwitchStackPointer();
//将当前调用任务(default)切换到psp栈模式,并为msp指定系统栈空间

下载

TesegOS源代码和文档下载:

csdn 下载
工程主页 下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值