一、实验说明:

  信号量是一个多任务内核提出的一个协议机构,上一个实验中我们介绍了信号量访问共享资源

的功能,其实信号量最初是用来控制访问共享资源的,它还可以用来同步一个中断服务函数和一个任

务,或者同步一个任务和另一个任务。

二、实验截图:

三、源代码下载链接:

链接:https://pan.baidu.com/s/1bpUaFmB 密码:dwre

四、核心代码:

/*
* Name : main
* Description : ---
* Author : liu.
*
* History
* --------------------
* Rev : 0.00
* Date : 07/12/2017
*
* create.
* --------------------
*/
/*实验现象:
打开串口工具putty.exe,终端显示此时信号量的值为0,按下ARM.KEY后,信号量的值每隔500ms增加1,
当松开ARM.KEY后,信号量的值开始减小,绿色ARM.LED开始闪烁,知道信号量的值减小为0,绿色LED熄灭。
*/
int main(void)
{
system_clock.initialize(); //系统时钟初始化
led.initialize(); //LED初始化
usart6.initialize(); //串口初始化
key.initialize(); OSInit(); //UCOS初始化
OSTaskCreate(start_task, //创建开始任务
(void*), //任务参数
(OS_STK*)&START_TASK_STK[START_STK_SIZE-], //任务堆栈
START_TASK_PRIO); //任务优先级
OSStart(); //开启UCOS
}
/*
* Name : start_task
* Description : ---
* Author : liu.
*
* History
* --------------------
* Rev : 0.00
* Date : 07/12/2017
*
* create.
* --------------------
*/
void start_task(void *pdata)
{
OS_CPU_SR cpu_sr; TaskSem = OSSemCreate();//创建信号量 OSStatInit();//初始化统计任务 OS_ENTER_CRITICAL();//关中断 OSTaskCreate(AppTask1_task,(void*),(OS_STK*)&AppTask1_TASK_STK[AppTask1_STK_SIZE-],AppTask1_TASK_PRIO);//创建AppTask1任务
OSTaskCreate(AppTask2_task,(void*),(OS_STK*)&AppTask2_TASK_STK[AppTask2_STK_SIZE-],AppTask2_TASK_PRIO);//创建AppTask2任务
OSTaskSuspend(OS_PRIO_SELF);//挂起start_task任务 OS_EXIT_CRITICAL();//开中断
}
/*
* Name : AppTask1_task
* Description : ---
* Author : liu.
*
* History
* --------------------
* Rev : 0.00
* Date : 07/12/2017
*
* create.
* --------------------
*/
void AppTask1_task(void *pdata)
{
while(){
if(ARM_KEY_STATE == KEY_DOWN){
OSSemPost(TaskSem); //发送信号量
}
usart6.printf("\x0c"); //清屏
usart6.printf("\033[1;32;40m"); //设置字体终端为绿色
usart6.printf("\r\n Hello, I am iCore4!\r\n\r");
usart6.printf("\r\n The value of Sem: %d\r",TaskSem->OSEventCnt);//打印出信号量的值
OSTimeDlyHMSM(,,,); //延时500ms
}
}
/*
* Name : AppTask2_task
* Description : ---
* Author : liu.
*
* History
* --------------------
* Rev : 0.00
* Date : 07/12/2017
*
* create.
* --------------------
*/
void AppTask2_task(void *pdata)
{
u8 err; while(){
if(ARM_KEY_STATE == KEY_UP){
OSSemPend(TaskSem,,&err); //请求信号量
LED_GREEN_ON; //绿灯亮
OSTimeDlyHMSM(,,,); //延时500ms
LED_GREEN_OFF; //绿灯灭
OSTimeDlyHMSM(,,,); //延时500ms
}else{
OSTimeDlyHMSM(,,,); //延时1000ms
}
}
}

iCore4链接:

【iCore4 双核心板_uC/OS-II】例程六:信号量——任务同步的更多相关文章

  1. 【iCore4 双核心板_uC/OS-II】例程四:软件定时器

    一.实验说明: 一些应用程序执行它们的任务时需要延迟一段特定的时间,因此uC/OS-II为我们提供了一些相应的 延时函数,本例程我们使用软件定时器定时500ms点亮相应的LED实现三色LED循环闪烁. ...

  2. 【iCore4 双核心板_uC/OS-II】例程二:任务的建立与删除

    一.实验说明: 本例程建立三个任务,通过任务寄存器来实现任务的建立与删除功能.红灯和绿灯同时以固定 频率闪烁,当任务寄存器为5时,删除绿灯闪烁的任务LED1,此时只有红灯闪烁,当任务寄存器的 值为10 ...

  3. 【iCore4 双核心板_uC/OS-II】例程十一:内存管理

    一.实验说明: 应用程序在运行中为了某种特殊需要,经常需要临时获得一些内存空间.而作为比较完善的操作系统uC/OS-II,也具有动态分配内存的能力. uC/OS-II对内存进行两级管理:把连续内存分成 ...

  4. 【iCore4 双核心板_uC/OS-II】例程十:信号量集

    一.实验说明: 在实际应用中,任务常常需要与多个事件同步,即要根据多个信号量组合作用的结果来决定任务的运行方式.UCOSII为了实现多个信号量组合的功能定义了一种特殊的数据结构——信号量集. 二.实验 ...

  5. 【iCore4 双核心板_uC/OS-II】例程九:消息队列

    一.实验说明: 前面介绍通过信息传递可以进行任务间的交流,信息也可以直接发送给一个任务,在uC/OS-II中每一个任务在它们内部都有一个消息队列,也即任务消息队列,用户可以直接给一个任务发送消息,不需 ...

  6. 【iCore4 双核心板_uC/OS-II】例程八:消息邮箱

    一.实验说明: 消息邮箱是uC/OS-II中的另一种通信机制,可以使一个任务或者中断服务子程序向另一个任务发送一个指针型的变量.通常该指针指向一个包含了“消息”的特定数据结构.   二.实验截图:   ...

  7. 【iCore4 双核心板_uC/OS-II】例程七:互斥信号量

    一.实验说明: 在介绍互斥信号量前,我们先简单地描述一下什么是优先级反转.使用实时内核心,优先级反转问题是实时系统中出现得最多的问题.假设任务H优先级高于任务M,任务M优先级高于任务L.任务H和任务M ...

  8. 【iCore4 双核心板_uC/OS-II】例程五:信号量——共享资源

    一.实验说明: 信号量是操作系统中的一类事件,是实现任务间通信的一个中间环节.当系统中的多个任务 在运行时,经常需要互相无冲突地访问同一个资源,或者需要互相支持的依赖,甚至有时还要互 相加以必要的限制 ...

  9. 【iCore4 双核心板_uC/OS-II】例程三:任务的挂起与恢复

    一.实验说明: 当一个任务正在运行的时候,由于某种情况可能需要终止运行一段时间,终止的这段时间就是 所谓的任务的挂起,可以由该任务自身或者其他任务来挂起一个任务.当被挂起的任务需要再次运 行的时候,可 ...

随机推荐

  1. SSM整合Activiti

    1.pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="h ...

  2. BZOJ2138 : stone

    根据Hall定理,若存在一个区间满足内部需求数$>$内部石子数,则不存在完美匹配. 由于区间互不包含,所以设: $a[i]$表示右端点$\leq i$的区间的容量之和. $b[i]$表示左端点$ ...

  3. [Tyvj1001]第K极值 (贪心?模拟)

    考前打tyvj的水题 题目描述 给定一个长度为N(0<n<=10000)的序列,保证每一个序列中的数字a[i]是小于maxlongint的非负整数 ,编程要求求出整个序列中第k大的数字减去 ...

  4. 修改Chrome启动参数解决跨域问题

    这个做法仅仅是针对自己本机,只是一个权宜方案 --disable-web-security --user-data-dir=本地用户信息目录 之后启动Chrome浏览器即可

  5. SourceTree安装教程和破解教程

    SourceTree破解版是一款非常实用的编程工具,这是一款专业的Git和Hg客户端,界面简洁,操作简单易上手,是开发者的必备工具,欢迎大家来绿色资源网下载体验!SourceTree是一款免费的Git ...

  6. Unity安装破解

    最近,电脑重新安装的系统,然后的然后就是软件之类的都要重新安装 一.在unity官网下载对应版本对应系统,之后双击下载得到的.exe可执行文件. 二.选择对应的包和引擎安装的本地路径,等待安装完成. ...

  7. sql基本查询语句

    查询语句的五中字句:where(条件查询),having(筛选),group by(分组),order by(排序),Limit(限制结果数) 一 单表查询 1.查询指定列:select 列名 fro ...

  8. 1、mysql初识

    之前我们写代码需要存取信息时用的是文件可是用文件存取数据非常局限,今天我们将走进一个新的世界mysql 本片导航: 数据库由来 数据库概述 mysql介绍 下载安装 mysql软件基本管理 初识sql ...

  9. float 浮点数与零值0比较大小 ZZ

    float x: 千万不要写x==0; 写出float x 与“零值”比较的if语句——一道面试题分析 写出float  x 与“零值”比较的if语句 请写出 float  x 与“零值”比较的 if ...

  10. asp.net mvc 实战化项目之三板斧

    laravel实战化项目之三板斧 spring mvc 实战化项目之三板斧 asp.net mvc 实战化项目之三板斧 接上文希望从一张表(tb_role_info 用户角色表)的CRUD展开asp. ...