📄 main.c
字号:
//-------------------------------------------------------------------------*
//工 程 名:uCOS-II SA *
//硬件连接: *
// (1)扩展板下方的10到17脚即标识为LED1_LD0至LED1_LD7的引脚连接8盏小灯 *
// (2)上SCI1连接PC的串口,通信波特率为9600 *
//工程描述:通过串口发送一个字节的数据按位控制8盏小灯(0为闪,1为暗) *
//目 的:实现uCOS-II上任务的划分与应用 *
//注 意:本程序实现的硬件平台为苏州大学MCU&DSP研发中心的MC9S12DG128核 *
// 心板与MT-ExBorard-Ⅰ型扩展板。该硬件平台使用9.8304MHZ的有源晶振 *
// 配置后系统程序运行的总线频率为4.9152MHZ。 *
//------------------清华2007版《嵌入式技术基础与实践》实例-----------------*
//包含头文件
#include <hidef.h> /* common defines and macros */
#include "Includes.H" //总头文件
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"
//函数声明
void TimerInit(void);
void StartTask(void *pdata);
void ShineLEDTask(void *pdata);
void SCISendTask(void *pdata);
//任务数据结构类型
typedef struct{
INT8U PAGE;
}TASKDATA;
TASKDATA Task1Data;
TASKDATA Task2Data;
TASKDATA Task3Data;
//任务堆栈定义
#define TASK_STK_SIZE 0x30
OS_STK Task1Stk[TASK_STK_SIZE];
OS_STK Task2Stk[TASK_STK_SIZE];
OS_STK Task3Stk[TASK_STK_SIZE];
//指示灯所接引脚定义
#define Light_P PORTB //灯(Light)接在PTB口
#define Light_D DDRB //相应的方向寄存器
//任务通信和控制灯使用
OS_EVENT * Str_Box; //指向消息邮箱的指针
OS_EVENT * Str_Semp; //指向互斥信号量的指针
INT8U LEDCtlByte; //控制小灯闪烁字节
//主函数
void main(void)
{
TimerInit(); //定时器初始化
SCIInit(); //SCI初始化
OSInit(); //操作系统初始化
Str_Box = OSMboxCreate((void *)0); //创建消息邮箱
Str_Semp = OSMutexCreate(0,(void *)0);//创建互斥信号量
SCI0CR2 |= 0x20; //开放接收中断
EnableInterrupts; //开中断
//用户代码开始
OSTaskCreate(StartTask,&Task1Data,
&Task1Stk[TASK_STK_SIZE -1],8);//开始任务
//用户代码结束
OSStart(); //os运行
}
//TimerInit:定时器初始化子函数---------------------------------------------*
//功 能:初始化定时器,产生的中断周期65ms *
//参 数:无 *
//返 回:无 *
//-------------------------------------------------------------------------*
void TimerInit(void)
{
TSCR1 &= ~(1<<7); //不可以定时中断
TSCR2 = 0b10000101; // 32/23=1MHZ, 中断周期65ms
}
//StartTask:开始任务子程序-------------------------------------------------*
//功 能:时钟节拍工作,创建其他的任务 *
//参 数:无 *
//返 回:无 *
//-------------------------------------------------------------------------*
void StartTask(void *pdata)
{
TSCR1 |= (1<<7); //开计数器中断
OSTaskCreate(ShineLEDTask,&Task2Data,
&Task2Stk[TASK_STK_SIZE -1],5);//任务1
OSTaskCreate(SCISendTask,&Task3Data,
&Task3Stk[TASK_STK_SIZE -1],3);//任务2
while(1) OSTimeDly(10); //释放10个时间片
}
//SCISendTask:串口发送任务子程序-------------------------------------------*
//功 能:串口发送消息邮箱中的数据,并存入全局变量LEDCtlByte *
//参 数:Str_Box为指向消息邮箱的指针 *
// Str_Semp为互斥信号量的指针 *
//返 回:LEDCtlByte控制小灯闪烁的字节 *
//调用函数:OSMboxPend请求消息邮箱 *
// SCISend1串行发送1字节数据 *
// OSMutexPend请求互斥信号量 *
// OSMutexPost发送互斥信号量 *
// OSTimeDly任务释放时间片 *
//-------------------------------------------------------------------------*
void SCISendTask(void *pdata)
{ INT8U err; //错误信息
INT8U * Str_msg; //指向消息邮箱中信息
while(1)
{ //请求消息邮箱
Str_msg = OSMboxPend(Str_Box,10,&err);
if(err == OS_NO_ERR)
{
OSMutexPend(Str_Semp,5,&err);//请求互斥信号量
LEDCtlByte = * Str_msg;
SCISend1(LEDCtlByte); //串口发送
OSMutexPost(Str_Semp); //发送互斥信号量
}
OSTimeDly(2); //释放2个时间片
}
}
//ShineLEDTask:指示灯闪烁任务子程序----------------------------------------*
//功 能:根据全局变量LEDCtlByte控制八盏指示灯的闪烁 *
//参 数: Stx_Semp为互斥信号量的指针 *
//返 回:无 *
//调用函数:OSMutexPend请求互斥信号量 *
// OSMutexPost发送互斥信号量 *
// OSTimeDly任务释放时间片 *
//-------------------------------------------------------------------------*
void ShineLEDTask(void *pdata) //控制八盏小灯闪烁的任务
{ INT8U err; //错误信息
INT8U tmp1=0xFF,tmp2; //缓存
//控制指示灯的I/O初始化
Light_D = 0xFF; //令指示灯引脚为输出
Light_P = 0x00; //初始时,指示灯"暗"
while(1)
{
OSMutexPend(Str_Semp,5,&err); //请求互斥信号量
tmp2 = LEDCtlByte; //小灯控制
OSMutexPost(Str_Semp); //发送互斥信号量
tmp1 = (~tmp1)|tmp2; //使小灯闪烁
Light_P =tmp1;
OSTimeDly(5); //释放5个时间片
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -