⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 《嵌入式系统-使用HCS12微控制器的设计与应用》在CodeWarrior开发环境下的源程序。
💻 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 + -