一、实验说明:

  信号量是操作系统中的一类事件,是实现任务间通信的一个中间环节。当系统中的多个任务

在运行时,经常需要互相无冲突地访问同一个资源,或者需要互相支持的依赖,甚至有时还要互

相加以必要的限制的制约才保证任务的顺利进行。信号量就像是一种上锁机制,一旦执行至上锁

代码段则一直等待,直到获得相应的钥匙才能进入被锁部分的代码。使用信号量的最初目的是为了

给共享资源设立一个标志,该标志表示共享资源的占用情况。当一个任务在访问共享资源之前,就

可以先对这个标志进行查询,从而在了解资源被占用的情况之后,再来准定自己的行为。

二、实验截图:

三、源代码下载链接:

链接:https://pan.baidu.com/s/1eSQ6IXW密码:vg2c

四、核心代码:

/*
* Name : main
* Description : ---
* Author : liu.
*
* History
* --------------------
* Rev : 0.00
* Date : 07/12/2017
*
* create.
* --------------------
*/
/*实验现象:
红灯和绿灯同时以固定频率闪烁,打开串口工具,可以看到有数据显示。
*/
int main(void)
{
system_clock.initialize(); //系统时钟初始化
led.initialize(); //LED初始化
usart6.initialize(); //串口初始化
usart6.printf("\x0c"); //清屏
usart6.printf("\033[1;32;40m"); //设置字体终端为绿色
usart6.printf("\r\n Hello, I am iCore4!\r\n\r\n"); 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 : led0_task
* Description : ---
* Author : liu.
*
* History
* --------------------
* Rev : 0.00
* Date : 07/12/2017
*
* create.
* --------------------
*/
void AppTask1_task(void *pdata)
{
u8 err;
unsigned char task1_mes[] = "The first task is running and the red LED is flashing!"; //任务一运行的信息 while(){
usart6.printf("\r\n TASK 1:\r");
OSSemPend(TaskSem,,&err); //请求信号量
memcpy(array, task1_mes, sizeof(task1_mes)); //将任务一信息放到共享资源中
usart6.printf("\r\n %s\r",array);
OSSemPost(TaskSem); //发送信号量 LED_RED_ON; //红灯亮
OSTimeDlyHMSM(,,,); //延时500ms
LED_RED_OFF; //红灯灭
OSTimeDlyHMSM(,,,); //延时500ms
}
}
/*
* Name : led_task
* Description : ---
* Author : liu.
*
* History
* --------------------
* Rev : 0.00
* Date : 07/12/2017
*
* create.
* --------------------
*/
void AppTask2_task(void *pdata)
{
u8 err;
unsigned char task2_mes[] = "The second task is running and the green LED is flashing!"; //任务一运行的信息 while(){
usart6.printf("\r\n TASK 2:\r");
OSSemPend(TaskSem,,&err); //请求信号量
memcpy(array, task2_mes, sizeof(task2_mes));//将任务二信息放到共享资源中
usart6.printf("\r\n %s\r",array); OSSemPost(TaskSem); //发送信号量 LED_GREEN_ON; //绿灯亮
OSTimeDlyHMSM(,,,); //延时1000ms
LED_GREEN_OFF; //绿灯灭
OSTimeDlyHMSM(,,,); //延时1000ms
}
}

iCore4链接:

最新文章

  1. GUI用户界面编程
  2. cPanel设置自定义404错误页
  3. Epplus 使用的简单介绍
  4. 好记心不如烂笔头,ssh登录 The authenticity of host 192.168.0.xxx can't be established. 的问题
  5. [转载] PowerMokito 使用
  6. SCI科技论文写作技巧-核心价值
  7. vc获取时间戳
  8. 第六周PTA作业
  9. Visual Studio Code Shortcuts
  10. java常用类:1。包装类(以Integer类为例)2.String类 3.StringBuffer
  11. SpringBoot项目打成一个war包
  12. 蓝桥杯第九届省赛 sscanf(),str.c_str()函数的使用
  13. kafka原理和实践(四)spring-kafka消费者源码
  14. beego+vue.js分离开发,结合发布,简单部署
  15. Swift 值类型和引用类型的内存管理
  16. TypeError: Object of type 'int64' is not JSON serializable
  17. swagger报错No handler found for GET /swagger-ui.html
  18. diliucizuoye
  19. Ribbon负载均衡策略与自定义配置new
  20. Golang之strings包

热门文章

  1. WPF DataGrid 每行ComboBox 内容不同的设置方法
  2. Django之form表单组件
  3. Python内置GUI模块Tkinter的几点笔记
  4. git https 请求报错 504
  5. ES6_入门(4)_数组的解构赋值
  6. Vue(二十三)vuex + axios + 缓存 运用 (以登陆功能为例)
  7. 转 ef中使用mysql步骤--Entity Framework 6 with MySql
  8. 【转】SQL Server 事务隔离级别详解
  9. Your project is not referencing the ".NETPortable,Version=v4.5,Profile=Profile259" framework. Add a reference to ".NETPortable,Version=v4.5,Profile=Profile259" in the "frameworks" section of your proj
  10. python测试开发django-51.Ajax发送post请求登录案例