单片机系统

第一章

1.概述µC/OS-II如何安装,目录的存放。

2.µC/OS-II中的数据类型均为浮点型。

3.OS_ENTER_CRITICAL() 和 OS_EXIT_CRITICAL():关中断和开中断是为了保护临界段代码。这些代码与处理器有关。关于宏的定义可以在OS_CPU.H中找到。

以及进入正确宏的代码。

4.全局宏的定义方式:

#ifdef   xxx_GLOBALS

#define  xxx_EXT

#else

#define  xxx_EXT extern

#endif

5.05基于PC的服务

对地址0x000B8000开始,在单色显示器中,用户可以把#define constant DISP_BASE从0xB800改为0xB000。

6.main()

main()函数调用PC_ElapsedInit()[程序清单L1.11(1)]来初始化定时器记录OSTaskStkChk()的执行时间。第二,所有的任务都使用OSTaskCreateExt()函数来建立任务[程序清单L1.11(2)](替代老版本的OSTaskCreate()),这使得每一个任务都可进行堆栈检查。

7.

 

 L 1.20TCB扩展数据结构的代码。

typedef struct {

    char    TaskName[30];                                          (1)

    INT16U  TaskCtr;

    INT16U  TaskExecTime;

    INT32U  TaskTotExecTime;

} TASK_USER_DATA;

 

8.

任务4的操作只是从邮箱发送[程序清单L1.25(1)]和接收[程序清单L1.25(2)],这使得用户可以测量任务在自己PC上执行的时间。任务4每10mS执行一次[程序清单L1.25(3)]。

 

程序清单 L 1.25 任务4

void  Task4 (void *data)

{

    OS_EVENT *mbox;

    INT8U     err;

 

 

    data = data;

    mbox = OSMboxCreate((void *)0);

    for (;;) {

        OSMboxPost(mbox, (void *)1);                               (1)

        OSMboxPend(mbox, 0, &err);                                 (2)

        OSTimeDlyHMSM(0, 0, 0, 10);                                (3)

    }

}

9.注意

EX3L.C中的OSTaskSwHook()函数的代码,该函数用来测量每个任务的执行时间,可以用来统计每一个任务的调度频率,也可以统计每个任务运行时间的总和。这些信息将存储在每个任务的TCB扩展数据结构中。每次任务切换的时候OSTaskSwHook()都将被调用。

每次任务切换发生的时候,OSTaskSwHook()先调用PC_ElapsedStop()函数[程序清单L1.27(1)] 来获取任务的运行时间[程序清单L1.27(1)]PC_ElapsedStop()要和PC_ElapsedStart()一起使用,上述两个函数用到了PC的定时器2(timer 2)。其中PC_ElapsedStart()功能为启动定时器开始记数;而PC_ElapsedStop()功能为获取定时器的值,然后清零,为下一次计数做准备。从定时器取得的计数将拷贝到time变量[程序清单L1.27(1)]。然后OSTaskSwHook()调用PC_ElapsedStart()重新启动定时器做下一次计数[程序清单L1.27(2)]。需要注意的是,系统启动后,第一次调用PC_ElapsedStart()是在初始化代码中,所以第一次任务切换调用PC_ElapsedStop()所得到的计数值没有实际意义,但这没有什么影响。如果任务分配了TCB扩展数据结构[程序清单L1.27(4)],其中的计数器TaskCtr进行累加[程序清单L1.27(5)]。TaskCtr可以统计任务被切换的频繁程度,也可以检查某个任务是否在运行。TaskExecTime [程序清单L1.27(6)]用来记录函数从切入到切出的运行时间,TaskTotExecTime[程序清单L1.27(7)]记录任务总的运行时间。统计每个任务的上述两个变量,可以计算出一段时间内各个任务占用CPU的百分比。OSTaskStatHook()函数会显示这些统计信息。

 

 

第二章

1.这种系统可称为前后台系统或超循环系统(Super-Loops)

 

2.代码的临界段

代码的临界段也称为临界区,指处理时不可分割的代码。一旦这部分代码开始执行,则不允许任何中断打入。为确保临界段代码的执行,在进入临界段之前要关中断,而临界段代码执行完以后要立即开中断。

 

3.任务

每个任务都是一个无限的循环。每个任务都处在以下5种状态之一的状态下,这5种状态是休眠态,就绪态、运行态、挂起态(等待某一事件发生)和被中断态

 

 

使Swap()函数具有可重入性:

 

Temp定义为局部变量

调用Swap()函数之前关中断,调动后再开中断

l 用信号量禁止该函数在使用过程中被再次调用

 

2.0.1 信号量(Semaphores)

信号量是60年代中期Edgser Dijkstra 发明的。信号量实际上是一种约定机制,在多任务内核中普遍使用.信号量用于:

控制共享资源的使用权(满足互斥条件)

l 标志某事件的发生

l 使两个任务的行为同步

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值