ucos的学习笔记一

应该说操作系统不会那我就不是个合格的电子工程师。今天起开始认真学习ucos。
学习的资料是火哥的《从 0 到 1 教你写 uCOS-III》。
首先分清三个概念,轮询系统和前后台系统,和多任务系统。轮询系统是在主循环中严格按照顺序先后一件件处理事情,不存在中断,因此实时性不可保证;前后台系统就是在中断服务程序里置标志位,如果耗时不长就在中断服务程序中进行,如果耗时较长就在主循环中执行,因此可以说前后台系统具有实时性,甚至起到了部分操作系统的功能。我之前的方式就是前后台系统。多任务系统是实时处理中断,事件的处理在任务中进行,而任务是有优先级的,优先级高的响应越快,因此,多任务系统具有最高的实时性。这里贴一个火哥的总结:
模型 事件响应 事件处理 特点
主程序 轮询响应事件,轮询处理事件
前后台系统 中断 主程序 实时响应事件,轮询处理事件
多任务系统 中断 任务 实时响应事件,实时处理事件
嗯,CSDN的这个文档编辑就像智障一样让我体验很差。
任务是无限循环无返回且相互独立。也有人称之为线程。在裸机系统中,由于只有一个任务,无需考虑内存分配,在操作系统多个任务的前提下,需要考虑内存的分配问题。栈存放全局变量,局部变量,子函数,中断,返回地址,(这里存疑),每个任务都需要单独分配一个栈空间。
贴一段启动代码:
Stack_Size EQU 0x00000400
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
以上的作用是定义栈的大小和位置,存疑的地方是没有找到 __initial_sp的定义,但仍然能确定栈位置。每个任务都需要分配一个独立的栈空间以保证互不影响。

下面开始叙述每个任务的调度部分:
TCB数据结构:任务控制块,贴上定义其的代码,在os.h中定义:
1 /* 任务控制块重定义 /
2 typedef struct os_tcb OS_TCB;
3
4 /
任务控制块 数据类型声明 */
5 struct os_tcb {
6 CPU_STK *StkPtr;
7 CPU_STK_SIZE StkSize;
8 };
可以看出这个结构体是有一个32位指针和一个32位整形数组成的,前者指向栈所在地址,后者表明栈的大小。
任务的创建:OSTaskCreate 函数,这里贴出源码:
1 void OSTaskCreate (OS_TCB *p_tcb, //TCB控制块
2 OS_TASK_PTR p_task, //任务名
3 void *p_arg, //任务形参
4 CPU_STK *p_stk_base, //堆栈起始地址
5 CPU_STK_SIZE stk_size, //堆栈大小
6 OS_ERR *p_err) //错误码
7 {
8 CPU_STK *p_sp; //定义了一个32位指针
9
10 p_sp = OSTaskStkInit (p_task,
11 p_arg,
12 p_stk_base,
13 stk_size);
14 p_tcb->StkPtr = p_sp;
15 p_tcb->StkSize = stk_size;
16
17 *p_err = OS_ERR_NONE;
18 }
OSTaskStkInit()是任务堆栈初始化函数,源码如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值