8、uCOS-Ⅱ 邮箱

1、 邮箱是信号量的扩展,相当于把一个指针定义的变量从一个任务传递到另一个或多个任务中去,这个指针是先发到邮箱,然后等待任务从邮箱里提取指针,这也就传递了指针指向的具体变量值。 等待邮箱的任务是可以设置无限等待和等待若干个时钟节拍后任务自动恢复执行。

2、实例代码

  1 /*****************************************************************************************************************************
  2 *
  3 *  文件名称:main.c
  4 *  文件功能:主函数
  5 *  文件说明:无
  6 *
  7 *****************************************************************************************************************************/
  8 /**********************************************************
  9 *
 10 *  头文件声明
 11 *
 12 **********************************************************/
 13
 14 #include "pbdata.h"
 15
 16
 17
 18
 19
 20
 21 /**********************************************************
 22 *
 23 *  调用函数声明
 24 *
 25 **********************************************************/
 26 void RCC_Configuration(void);//时钟配置函数
 27
 28 void  start_task(void *pdata);//开始任务函数
 29
 30
 31
 32
 33
 34 /**********************************************************
 35 *
 36 *  主函数
 37 *
 38 **********************************************************/
 39 int main(void)
 40 {
 41     Delay_Init();//延时函数初始化
 42
 43     RCC_Configuration();//时钟配置
 44
 45     LED_GPIO();//LED的GPIO引脚配置
 46
 47
 48
 49 /*操作系统的处理*/
 50     OSInit();//初始化UCOS操作系统
 51     led1_MBOX=OSMboxCreate((void *)0);//建立一个消息邮箱
 52     OSTaskCreate(
 53               start_task,  //指向任务代码的指针
 54               (void *)0,    //任务开始执行时,传递给任务参数的指针
 55               (OS_STK *) & START_TASK_STK[START_STK_SIZE-1],//分配给任务堆栈的栈顶指针
 56               START_TASK_PRIO//分配给任务的优先级
 57              );
 58     OSStart();//启动OS操作系统
 59
 60
 61
 62
 63 }
 64
 65
 66
 67 /**********************************************************
 68 *
 69 *  函数名称:RCC_Configuration(void)
 70 *  函数功能:时钟配置
 71 *  输入参数:无
 72 *  输出参数:无
 73 *  函数说明:无
 74 *
 75 **********************************************************/
 76 void  RCC_Configuration(void)
 77 {
 78     SystemInit();//系统初始化
 79
 80     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//LED1对应GPIO时钟使能
 81
 82     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//按键对应GPIO时钟使能
 83 }
 84
 85
 86
 87
 88
 89
 90 /**********************************************************
 91 *
 92 *  函数名称:start_task(void *pdata)
 93 *  函数功能:开始任务
 94 *  输入参数:*pdata
 95 *  输出参数:无
 96 *  函数说明:无
 97 *
 98 **********************************************************/
 99 void  start_task(void *pdata)
100 {
101      u8  msg[2];
102
103    OS_CPU_SR  cpu_sr=0;
104
105    pdata=pdata;//防止编译器报错
106
107    OSStatInit();//初始化统计任务
108
109    OS_ENTER_CRITICAL();//进入临界区,中断无法打断
110
111 /*创建任务*/
112    /*LED1任务*/
113    OSTaskCreate(
114               led1_task,  //指向任务代码的指针
115               (void *)0,    //任务开始执行时,传递给任务参数的指针
116               (OS_STK *) & LED1_TASK_STK[LED1_STK_SIZE-1],//分配给任务堆栈的栈顶指针
117               LED1_TASK_PRIO//分配给任务的优先级
118                );
119
120    //OSTaskSuspend(START_TASK_PRIO);//挂起开始任务
121
122    OS_EXIT_CRITICAL();//退出临界区,可以被中断打断
123
124      while(1)
125    {
126 /*100ms*/
127    msg[0]=0x00;
128    msg[1]=0x64;
129 /*发送出去*/
130    OSMboxPost(led1_MBOX,(void *)&msg);
131    delay_ms(1000);
132      delay_ms(1000);
133    delay_ms(1000);
134    delay_ms(1000);
135    delay_ms(1000);
136
137 /*500ms*/
138    msg[0]=0x01;
139    msg[1]=0xf4;
140 /*发送出去*/
141    OSMboxPost(led1_MBOX,(void *)&msg);
142    delay_ms(1000);
143      delay_ms(1000);
144    delay_ms(1000);
145    delay_ms(1000);
146    delay_ms(1000);
147
148    }
149
150 }

  1 /*****************************************************************************************************************************
  2 *
  3 *  文件名称:pbdata.c
  4 *  文件功能:自定义函数
  5 *  文件说明:无
  6 *
  7 *****************************************************************************************************************************/
  8
  9
 10
 11 #include "pbdata.h"
 12
 13 u8 dt=0;
 14 static u8  fac_us=0;//us延时倍乘数
 15 static u16 fac_ms=0;//ms延时倍乘数
 16
 17 OS_EVENT* led1_MBOX;//定义一个邮箱指针变量
 18
 19 /**********************************************************
 20 *
 21 *  函数名称:Delay_Init(void)
 22 *  函数功能:初始化延时函数
 23 *  输入参数:无
 24 *  输出参数:无
 25 *  函数说明:当使用ucos的时候,此函数会初始化ucos的时钟节拍
 26 *            SYSTICK的时钟固定为HCLK时钟的1/8
 27 *            SYSCLK:系统时钟
 28 *
 29 **********************************************************/
 30 void Delay_Init(void)
 31 {
 32     u32 reload;
 33     SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);    //选择外部时钟,HCLK/8
 34     fac_us=SystemCoreClock/8000000;    //为系统时钟的1/8
 35
 36     reload=SystemCoreClock/8000000;    //每秒钟的计数次数,单位为K
 37     reload*=1000000/OS_TICKS_PER_SEC;//根据OS_TICKS_PER_SEC设定溢出事件,reload为24位寄存器,最大值:16777216,在72M下,约合1.86s左右
 38
 39     fac_ms=1000/OS_TICKS_PER_SEC;// 代表ucos可以延时的最少单位
 40     SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk;       //开启SYSTICK中断
 41     SysTick->LOAD=reload;     //每1/OS_TICKS_PER_SEC秒中断一次
 42     SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;       //开启SYSTICK
 43 }
 44
 45
 46
 47
 48
 49 /**********************************************************
 50 *
 51 *  函数名称:delay_us(u32 nus)
 52 *  函数功能:延时微秒子程序
 53 *  输入参数:nus,  延时微秒数
 54 *  输出参数:无
 55 *  函数说明:无
 56 *
 57 **********************************************************/
 58 void delay_us(u32 nus)
 59 {
 60     u32 ticks;
 61     u32 told,tnow,tcnt=0;
 62     u32 reload=SysTick->LOAD;    //LOAD的值
 63     ticks=nus*fac_us;             //需要的节拍数
 64     tcnt=0;
 65     told=SysTick->VAL;            //刚进入时的计数器值
 66     while(1)
 67     {
 68         tnow=SysTick->VAL;
 69         if(tnow!=told)
 70         {
 71             if(tnow<told)tcnt+=told-tnow;//这里注意一下SYSTICK是一个递减的计数器就可以了
 72             else tcnt+=reload-tnow+told;
 73             told=tnow;
 74             if(tcnt>=ticks)break;//时间超过/等于要延时的事件,则退出
 75         }
 76     };
 77 }
 78
 79
 80
 81
 82
 83
 84 /**********************************************************
 85 *
 86 *  函数名称:delay_ms(u16 nms)
 87 *  函数功能:延时毫秒子程序
 88 *  输入参数:nms,  延时微秒数
 89 *  输出参数:无
 90 *  函数说明:无
 91 *
 92 **********************************************************/
 93 void delay_ms(u16 nms)
 94 {
 95     if(OSRunning==TRUE)//如果os已经在跑了
 96     {
 97         if(nms>=fac_ms)//延时的事件大于ucos的最少时间周期
 98         {
 99                OSTimeDly(nms/fac_ms);//ucos延时
100         }
101         nms%=fac_ms;                //ucos已经无法提供这么小的延时了,采用普通方式延时
102     }
103     delay_us((u32)(nms*1000));    //普通方式延时,此时ucos无法启动调度
104 }
105
106
107
108
109 /**********************************************************
110 *
111 *  函数名称:delay(u32 nCount)
112 *  函数功能:普通不精确延时
113 *  输入参数:nCount,  延时时间长短
114 *  输出参数:无
115 *  函数说明:无
116 *
117 **********************************************************/
118 void delay(u32 nCount)
119 {
120     for(;nCount!=0;nCount--);
121 }

 1 /*****************************************************************************************************************************
 2 *
 3 *  文件名称:pbdata.h
 4 *  文件功能:自定义函数的头文件声明
 5 *  文件说明:无
 6 *
 7 *****************************************************************************************************************************/
 8
 9
10 #ifndef _pbdata_H
11 #define _pbdata_H
12
13
14
15
16
17
18 /**********************************************************
19 *
20 *  需要引入的头文件
21 *
22 **********************************************************/
23 #include "stm32f10x.h"
24 #include "includes.h"
25 #include "misc.h"
26
27 #include "led.h"//LED相关头文件
28 #include "key.h"//key相关头文件
29
30
31 /**********************************************************
32 *
33 *  任务相关设置
34 *
35 **********************************************************/
36 /*开始任务*/
37     #define  START_TASK_PRIO   9  //设置任务优先级
38     #define  START_STK_SIZE    64  //空间大小=64*4(字节)
39     static OS_STK  START_TASK_STK[START_STK_SIZE];//创建任务堆栈空间
40
41
42 /*LED1任务*/
43     #define  LED1_TASK_PRIO   6  //设置任务优先级
44     #define  LED1_STK_SIZE    64  //空间大小=64*4(字节)
45     static OS_STK   LED1_TASK_STK[LED1_STK_SIZE];//创建任务堆栈空间
46
47
48
49
50
51
52 /**********************************************************
53 *
54 *  外部变量声明
55 *
56 **********************************************************/
57
58 extern OS_EVENT* led1_MBOX;//定义一个邮箱指针变量
59
60
61 /**********************************************************
62 *
63 *  子函数程序声明
64 *
65 **********************************************************/
66 void delay(u32 nCount);//普通不精确延时
67 void Delay_Init(void);//延时函数初始化
68 void delay_us(u32 nus);//微秒延时
69 void delay_ms(u16 nms);//毫秒延时
70
71
72
73
74 #endif

 1 /*****************************************************************************************************************************
 2 *
 3 *  文件名称:led.c
 4 *  文件功能:led相关函数
 5 *  文件说明:无
 6 *
 7 *****************************************************************************************************************************/
 8
 9
10
11
12 #include "pbdata.h"
13
14
15
16 /**********************************************************
17 *
18 *  函数名称:LED_GPIO(void)
19 *  函数功能:LED的GPIO配置
20 *  输入参数:无
21 *  输出参数:无
22 *  函数说明:无
23 *
24 **********************************************************/
25
26 void LED_GPIO(void)//GPIO初始化函数
27 {
28     GPIO_InitTypeDef GPIO_InitStructure;//定义一个GPIO设置的结构体变量
29
30 /*LED1配置*/
31     /*结构体变量赋值*/
32     GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;////引脚配置
33     GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//配置频率
34     GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出
35 /*对应的GPIO初始化*/
36   GPIO_Init(GPIOB,&GPIO_InitStructure);
37 }
38
39
40
41
42
43
44
45 /**********************************************************
46 *
47 *  函数名称:led1_task(void *pdata)
48 *  函数功能:led1任务处理函数
49 *  输入参数:*pdata
50 *  输出参数:无
51 *  函数说明:无
52 *
53 **********************************************************/
54
55 void led1_task(void *pdata)
56 {
57     INT8U err;
58     u16 led1_timer=500;
59     u8 *msg;
60     pdata=pdata;
61
62
63     while(1)
64     {
65         msg=(u8 *)OSMboxPend(led1_MBOX,10,&err);//等待消息邮箱,获取延时时间
66
67         if(err==OS_ERR_NONE)
68         {
69             led1_timer=(msg[0]<<8)+msg[1];
70
71             if(led1_timer>1000) led1_timer=1000;
72             if(led1_timer<100) led1_timer=100;
73         }
74
75         GPIO_SetBits(GPIOB,GPIO_Pin_5);
76         delay_ms(led1_timer);//
77         GPIO_ResetBits(GPIOB,GPIO_Pin_5);
78         delay_ms(led1_timer);//
79     }
80 }

 1 /*****************************************************************************************************************************
 2 *
 3 *  文件名称:led.h
 4 *  文件功能:led相关函数的头文件
 5 *  文件说明:无
 6 *
 7 *****************************************************************************************************************************/
 8
 9
10 #ifndef _LED_H
11 #define _LED_H
12
13 #include "pbdata.h"
14
15
16 void LED_GPIO(void);//LED的GIPO引脚配置
17
18 void  led1_task(void *pdata);//LED1任务
19
20
21
22
23 #endif

3、工程下载:

http://download.csdn.net/detail/a1181803348/8852095

时间: 2024-10-26 10:00:10

8、uCOS-Ⅱ 邮箱的相关文章

ucos事件邮箱信号量队列详解

Ucos的事件分为时钟,信号量,互斥性信号量,消息队列,以及消息邮箱 首先说信号量 信号量在ucos中的类型定义为OS_EVENT_TYPE_SEM,在任务控制块ecb中,主要是用到的是信号量计数器OSEventCnt,当有任务申请信号量的时候,如果信号量OSEventCnt的值大于0,则将OSEventCnt-1是任务继续运行,如果OSEventCnt已经为0,那么任务将会被挂到任务等代表中,当别的任务发送信号量的时候,被挂起的任务得到信号量,并设置为ready准备进行下一次调度,如果这时候任

ucos任务控制块详解

Ucos实现多任务的基础包括几个方面:任务控制块,任务堆栈,中断,任务优先级,一一说起 首先,任务控制块的结构如下 //系统在运行一个任务的时候,按照任务的优先级获取任务控制块,再在任务堆栈中获得任务代码指针 typedef struct os_tcb {//任务控制块 OS_STK          *OSTCBStkPtr;           /*指向任务堆栈栈顶的指针*/ #if OS_TASK_CREATE_EXT_EN > 0u void            *OSTCBExtPt

ucos信号量集源码分析

在实际的应用之中,一个任务经常需要等待多个信号量的同时生效,或者说任务需要根据多个信号量的组合作用的结果来决定任务的运行方式,为了实现这种多信号量组合的功能,ucos实现了信号量集的特殊结构. 信号量集的基础仍然是信号量,它如同一个多个信号量组成的与非门来构成逻辑结果控制任务的执行. 信号量在ucos的实现分为两个部分,第一部分叫做标志组,其中存放了信号量集中的所有信号,第二个叫做等待任务链表,链表中的每个节点对应一个正在等待信号量集的等待任务,信号量集根据这个链表来管理等待任务 不同于消息队列

UCOS明白解析

UCOSII 是一个可以基于 ROM 运行的.可裁减的.抢占式.实时多任务内核,具有高度可移植性,特别适合于微处理器和控制器,是和很多商业操作系统性能相当的实时操作系统(RTOS).为了提供最好的移植性能, UCOSII 最大程度上使用 ANSI C 语言进行开发,并且已经移植到近 40 多种处理器体系上,涵盖了从 8 位到 64 位各种 CPU(包括 DSP).UCOSII 是专门为计算机的嵌入式应用设计的, 绝大部分代码是用 C 语言编写的. CPU 硬件相关部分是用汇编语言编写的.总量约

[stm32][ucos] 1、基于ucos操作系统的LED闪烁、串口通信简单例程

* 内容简述: 本例程操作系统采用ucos2.86a版本, 建立了5个任务            任务名                                             优先级            APP_TASK_START_PRIO                               2            主任务                          Task_Com1_PRIO                                

[stm32][ucos][ucgui] 2、LED闪烁、串口、滑块、文本编辑框简单例程

上一篇:[stm32][ucos] 1.基于ucos操作系统的LED闪烁.串口通信简单例程 * 内容简述: 本例程操作系统采用ucos2.86a版本, 建立了7个任务            任务名                                             优先级            APP_TASK_START_PRIO                               2            主任务            APP_TASK_USER_

ucos源码读后总结

转载请注明原文出处,http://www.cnblogs.com/flyingcloude/p/6992351.html 花了将近一个星期的时间将ucos的源码大致的通读了一遍,在这里先进行总结一下,以便以后继续深入学习. (1)ucos的源码结构: 与处理器类型无关的代码:OS_CORE.C OS_FLAG.C OS_MBOX.C OS_MEM.C OS_MUTEX.C OS_Q.C OS_SEM.C OS_TIME.C uC/OS-II.C uC/OS-II.H uC/OS的配置文件(与应用

ucos2 事件 任务的通讯和同步 信号量 互斥量 消息邮箱 消息队列

这会想了想,在复习资料后,最后再做个核心代码分析 ucos中使用信号量.消息邮箱.消息队列,这些数据结构来作为通信中间媒介.这些数据结构会影响任务的程序流程,因此也叫做事件. 一.信号量 是进行任务通信的最基本事件 二值信号可以实现共享资源的独占,也叫互斥信号量. 注意:使用信号量的时候要,高优先级的任务等待接受信号量的时候,高优先级的任务在等待接受信号量的时候,如果低优先级的任务没有释放信号量,那就会一直等待下去,那低优先级的任务就没有机会运行了,系统就出现死机的状况了.   解决方法:加个超

.Net使用163smtp发送邮件时错误:邮箱不可用. has no permission解决方法

C#实现简单邮件发送代码如下 public static void SendAsync(string emailTo, string subject, string mailBody) { var msg = new MailMessage(); msg.To.Add(emailTo); // msg.From = new MailAddress(_userNameForEmail, "显示的发件人名称", System.Text.Encoding.UTF8); msg.Subject

jQuery-文本框事件应用-判断邮箱地址

1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2 <html xmlns="http://www.w3.org/1999/xhtml"> 3 <head> 4 <title>文本框中的事件应用<