- 14
- 0
- 约7.99千字
- 约 20页
- 2018-06-09 发布于河南
- 举报
嵌入式实时操作系统(第12课时)
嵌入式实时操作系统;5.2.3 向信号量集发信号;例如,要对信号量集FlagPtr发送信号,待发送的信号为OSFlagFlags中的第0位和第3位并且是要把它们置1,则调用时的代码如下:
OS_FLAGS OSFlagPost(
FlagPtr, //信号量集指针 (OS_FLAGS)9, //选择所要发送的信号
OS_FLAG_SET, //信号有效的选项
err //错误信息
);;例5-1 设计一个有三个任务的应用程序,这三个任务分别叫做MyTask、YouTask和HerTask。要求用一个信号量集来控制MyTask的运行,即任务YouTask发送一个信号,任务HerTask发送一个信号,当这两个任务都发了信号之后,MyTask才能运行。
答:应用程序的代码如下:
/******************************************Test******************************************/
#include “includes.h”
#define TASK_STK_SIZE 512 //任务堆栈长度
#define N_MESSAGES 128 //定义消息队列长度
OS_STK StartTaskStk[TASK_STK_SIZE]; //定义任务堆栈区
OS_STK MyTaskStk[TASK_STK_SIZE]; //定义任务堆栈区
OS_STK YouTaskStk[TASK_STK_SIZE]; //定义任务堆栈区
OS_STK HerTaskStk[TASK_STK_SIZE]; //定义任务堆栈区
INT16S key; //用于退出的键
char *s1=“MyTask正在运行”;
char *s2=“YouTask正在运行”;
char *s3=“HerTask正在运行”;
INT8U err;
INT8U y=0; //字符显示位置;OS_FLAG_GRP *Sem_F;
void StartTask(void *data); //声明起始任务
void MyTask(void *data); //声明任务
void YouTask(void *data); //声明任务
void HerTask(void *data); //声明任务
/**************************************主函数*******************************************/
void main(void)
{
OSInit(); //初始化μc/os-II
PC_DOSSaveReturn( ); //保存DOS环境
PC_VectSet(uCOS,0SCtxSw); //安装μc/os-II中断
Sem_F=OSFlagCreate(0,err); //创建信号量集
OSTaskCreate(StartTask, //创建任务StartTask
(void *)0, //给任务传递参数
StartTaskStk[TASK_STK_SIZE-1], //设置任务堆栈栈顶指针
0); //使任务的优先级别为0
OSStart(); //启动多任务管理
};/*******************************任务StartTask*****************************************/
void StartTask(void *pdata)
{
#if OS_CRITICAL_METHOD==3
OS_CPU_SR cpu_sr;
#endif
pdata=pdata;
OS_ENTER_CRITICAL( );
PC_VectSet(0x08,OSTickISR); //安装时钟中断向量
PC_SetTickRate(OS_TICKS_PER_SEC); //设置μc/os-II时钟频率
OS_EXIT_CRITICA
原创力文档

文档评论(0)