打印

分享TI LM3S811开发板使用心得——UCOS-信号量-邮箱练习

[复制链接]
4974|28
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lixiaoxu2meng|  楼主 | 2011-11-21 13:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 lixiaoxu2meng 于 2011-11-29 09:29 编辑

声明:本人将ZLG公司移植好的模板直接拿过来用的(在这里表示感谢),非本人移植。
本工程主要练习 任务的建立及信号量、邮箱等的使用,本工程一共创建了四个任务(空闲及统计任务不算在内)。
          1.taskStart主要用来建立任务(即通常说的用任务建立任务,当然不这么用以可以,个人习惯问题)信号量 邮箱 等 个人感觉这样比较清晰。
           2.task1 使用系统延时(使用时必须注意使能 在os_cfg.h中)实现LED小灯闪烁,同时向任务2发送信号量。
           3.task2等待信号量然后点亮并熄灭LED,同时向任务3发送邮箱(为延时信息)
           4.task3等待邮箱 并根据邮箱传递来的延时时间来改变LED的闪烁周期

main函数
/*--------------文件信息---------------------------------------------------------
* 文 件 名: main.c
* 创 建 人: lixiaoxu
* 创建日期: 2011年11月16日
* 描 述: 主程序C语言入口
* 说明:UCOS模板移植于 ZLG Company
*---------- 版本信息------------------------------------------------------------
* 版 本: V1.0
*
*-------------------------------------------------------------------------------*/
#include "includes.h"
/*********************************************************************************
任务优先级
**********************************************************************************/
#define TASK_START_PRIO 0
#define TASK_1_PRIO 10
#define TASK_2_PRIO2 11
#define TASK_3_PRIO3 12

/*********************************************************************************
任务堆栈大小
*********************************************************************************/
#define TASK_START_STK_SIZE 50 //定义任务堆栈大小
#define TaskStkLengh_32 32
#define TaskStkLengh_64 64
#define TaskStkLengh_128 128
#define TaskStkLengh_256 256

static OS_STK Task_Start_Stk[TASK_START_STK_SIZE];
static OS_STK Task_1_Stk[TaskStkLengh_64];
static OS_STK Task_2_Stk[TaskStkLengh_64];
static OS_STK Task_3_Stk[TaskStkLengh_64];

/********************************************************************************
定义任务 信号量 邮箱 消息队列
********************************************************************************/
OS_EVENT *AckSem;
OS_EVENT *Delay_Mbox;

/*******************************************************************************
函数声明
*******************************************************************************/
static void taskStart (void *pdata);
static void task1 (void *pdata);
static void task2 (void *pdata);
static void task3 (void *pdata);

/******************************************************************************
* 本工程实现功能:实现邮箱、信号量的使用
* 注意:
*
******************************************************************************/
int main (void)
{
OSInit(); //OS-II 初始化uC/OS-II的内核

OSTaskCreate ( taskStart,
(void *)0, //创建启动任务
&Task_Start_Stk[TASK_START_STK_SIZE-1],
TASK_START_PRIO );

OSStart(); //Start uC/OS-II 启动uC/OS-II
return(0) ;
}

/*********************************************************************************************************
** Function name: Task_Start
** Descriptions: Start task
** input parameters: *pdata
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
static void taskStart (void *pdata)
{
pdata = pdata;

Set_System(); //用于mcu的配置

OS_CPU_SysTickInit(); //启动系统SysTick 作为UCOS的时基

#if OS_TASK_STAT_EN > 0 //使能统计功能
OSStatInit();
#endif
//在这里创建 任务中所用到的 信号量 邮箱 消息队列
AckSem = OSSemCreate(0); //创建信号量
Delay_Mbox = OSMboxCreate((void *)0); //创建邮箱 由任务2向任务3发送LED闪烁间隔
// 在这里创建要使用的任务
OSTaskCreate (task1, (void *)0, //创建任务1
&Task_1_Stk[TaskStkLengh_64-1],
TASK_1_PRIO);

OSTaskCreate (task2, (void *)0, //创建任务2
&Task_2_Stk[TaskStkLengh_64-1],
TASK_2_PRIO2);
OSTaskCreate (task3, (void *)0, //创建任务2
&Task_3_Stk[TaskStkLengh_64-1],
TASK_3_PRIO3);
while (1)
{
OSTaskSuspend(OS_PRIO_SELF); //挂起启动任务,也可以删除
}
}

/*********************************************************************************************************
** Function name: task1
** Descriptions: 任务1
** input parameters: *pdata
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
static void task1 (void *pdata)
{
pdata = pdata;
while (1)
{
GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_0,GPIO_PIN_0); //点亮LED3
OSTimeDlyHMSM(0,0,0,500); //延时0.5秒
GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_0,~GPIO_PIN_0); //熄灭LED3
OSTimeDlyHMSM(0,0,0,500); //延时0.5秒
OSSemPost (AckSem); //发送信号量
}
}
/*********************************************************************************************************
** Function name: task2
** Descriptions: 任务2
** input parameters: *pdata
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
static void task2 (void *pdata)
{
INT8U err;
u8 time = 1;
pdata = pdata;
while (1)
{
OSSemPend (AckSem, 0, &err); //等待信号量
GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_1,GPIO_PIN_1); //点亮LED4
OSSemPend (AckSem, 0, &err); //等待信号量
GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_1,~GPIO_PIN_1); //熄灭LED4
OSMboxPost(Delay_Mbox, &time); //发送邮箱 邮箱信息为 1和6 交替发送
if(time ==6) time = 1;
else time = 6;
}
}
/*********************************************************************************************************
** Function name: task3
** Descriptions: 任务3
** input parameters: *pdata
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
static void task3 (void *pdata)
{
INT8U err;
u8 *RX_Mbox; //存放邮箱信息
pdata = pdata;

while (1)
{
RX_Mbox = OSMboxPend(Delay_Mbox, 0, &err); //接收邮箱信息
OSTimeDlyHMSM(0,0,*RX_Mbox,0); //延时x秒
GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_1,GPIO_PIN_1); //点亮LED5
OSTimeDlyHMSM(0,0,*RX_Mbox,0); //延时x秒
GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_1,~GPIO_PIN_1); //熄灭LED5
}
}
工程截图
评分
参与人数 1威望 +10 收起 理由
hotpower + 10

相关帖子

沙发
lixiaoxu2meng|  楼主 | 2011-11-21 16:01 | 只看该作者
上传工程 编译 下载即可看到效果

UCOS.rar

2.89 MB

使用特权

评论回复
板凳
hotpower| | 2011-11-21 23:56 | 只看该作者
非常好~~~

使用特权

评论回复
地板
lixiaoxu2meng|  楼主 | 2011-11-22 07:24 | 只看该作者
3# hotpower
只是学了点皮毛  谢谢老师

使用特权

评论回复
5
hotpower| | 2011-11-22 08:11 | 只看该作者
好好学习,不管是什么厂家。

使用特权

评论回复
6
lixiaoxu2meng|  楼主 | 2011-11-22 08:12 | 只看该作者
5# hotpower

使用特权

评论回复
7
hotpower| | 2011-11-22 13:54 | 只看该作者
这里的裤子太贵,俺发裤子咔嚓咔嚓的

使用特权

评论回复
8
lixiaoxu2meng|  楼主 | 2011-11-22 14:44 | 只看该作者
本帖最后由 lixiaoxu2meng 于 2011-11-22 14:47 编辑

7# hotpower

呵呵 对了老师 我们第一批板子与其他批板子有不一样的地方吗 为我的SD卡还是初始化 不成功 :'(

使用特权

评论回复
9
永远的不知| | 2011-11-22 16:51 | 只看该作者
1# lixiaoxu2meng

楼主动作挺快的,已经用811做了不少事情了,加油。

使用特权

评论回复
10
nwx8899| | 2011-11-22 18:37 | 只看该作者
值得学习

使用特权

评论回复
11
hotpower| | 2011-11-23 02:11 | 只看该作者
7# hotpower

呵呵 对了老师 我们第一批板子与其他批板子有不一样的地方吗 为我的SD卡还是初始化 不成功 :'(
lixiaoxu2meng 发表于 2011-11-22 14:44


已返还100元订金和第2届250状元奖金估计350元,请注意查收。
返还交易信息在邮箱内。
请在https://bbs.21ic.com/icview-287276-1-1.html跟帖确认返还。

使用特权

评论回复
12
lixiaoxu2meng|  楼主 | 2011-11-23 07:42 | 只看该作者
9# 永远的不知
呵呵也没做什么 简单的学习了一下

使用特权

评论回复
13
lixiaoxu2meng|  楼主 | 2011-11-23 07:43 | 只看该作者
10# nwx8899
谢谢相互学习

使用特权

评论回复
14
lixiaoxu2meng|  楼主 | 2011-11-23 07:43 | 只看该作者
11# hotpower
已收到了老师

使用特权

评论回复
15
hotpower| | 2011-11-23 15:25 | 只看该作者
11# hotpower  
已收到了老师
lixiaoxu2meng 发表于 2011-11-23 07:43


努力学习,不管什么厂家,学到的都是自己的。
有时间俺也玩玩TI的M3,M4

使用特权

评论回复
16
heweibig| | 2011-11-23 15:35 | 只看该作者
返还100元订金和第2届250状元奖金估计350元?:funk:

使用特权

评论回复
17
hotpower| | 2011-11-26 19:10 | 只看该作者
返还100元订金和第2届250状元奖金估计350元?:funk:
heweibig 发表于 2011-11-23 15:35


共计350元,晕,老花眼写错了

使用特权

评论回复
18
lzlong| | 2011-11-28 10:49 | 只看该作者
楼主学习的很厉害啊

使用特权

评论回复
19
baixichi| | 2011-12-1 10:22 | 只看该作者
楼主在eeworld也注册过会员吧

使用特权

评论回复
20
teet| | 2011-12-1 11:49 | 只看该作者
果然是酷贴啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

1679

帖子

2

粉丝