UCOS同步与互斥
代码为老师教授。
/*
*********************************************************************************************************
* EXAMPLE CODE
*
* (c) Copyright 2013; Micrium, Inc.; Weston, FL
*
* All rights reserved. Protected by international copyright laws.
* Knowledge of the source code may not be used to write a similar
* product. This file may only be used in accordance with a license
* and should not be redistributed in any way.
*********************************************************************************************************
*//*
*********************************************************************************************************
*
* EXAMPLE CODE
*
* IAR Development Kits
* on the
*
* STM32F429II-SK KICKSTART KIT
*
* Filename : app.c
* Version : V1.00
* Programmer(s) : YS
* DC
*********************************************************************************************************
*//*
*********************************************************************************************************
* INCLUDE FILES
*********************************************************************************************************
*/#include <includes.h>
#include <led.h>
#include <usart.h>
#define EV_FLAG1 (1 << 0)// 事件1 bit0 结合下面的创建:发生为1
//#define EV_FLAG2 (1 << 1)// 事件2 bit1
OS_FLAG_GRP EventFlags; //定义一个事件标志组 EventFlags
/*
*********************************************************************************************************
* LOCAL DEFINES
*********************************************************************************************************
*/#define APP_TASK_EQ_0_ITERATION_NBR 16u/*
*********************************************************************************************************
* LOCAL GLOBAL VARIABLES
*********************************************************************************************************
*//* ----------------- APPLICATION GLOBALS -------------- */
static OS_TCB AppTaskStartTCB;
static CPU_STK AppTaskStartStk[APP_CFG_TASK_START_STK_SIZE];/* ------------ FLOATING POINT TEST TASK -------------- */
static OS_TCB App_TaskEq0FpTCB;
static CPU_STK App_TaskEq0FpStk[APP_CFG_TASK_EQ_STK_SIZE];/*
*********************************************************************************************************
* FUNCTION PROTOTYPES
*********************************************************************************************************
*/static void AppTaskStart (void *p_arg);
static void AppTaskCreate (void);
static void AppObjCreate (void);static void App_TaskEq0Fp (void *p_arg); /* Floating Point Equation 0 task. *//*
*********************************************************************************************************
* main()
*
* Description : This is the standard entry point for C code. It is assumed that your code will call
* main() once you have performed all necessary initialization.
*
* Arguments : none
*
* Returns : none
*********************************************************************************************************
*/OS_ERR err;OS_TCB Task1TCB;
CPU_STK Task1Stak[100];OS_TCB Task2TCB;
CPU_STK Task2Stak[100];void delay(int num)
{while(num--);
}OS_MUTEX lock;
int i=0;//全局
int flags_num;
void TaskFunc1(void *tk1){OS_ERR err;while(1){OSFlagPend ((OS_FLAG_GRP *)&EventFlags,(OS_FLAGS)EV_FLAG1,(OS_TICK)0,(OS_OPT)OS_OPT_PEND_FLAG_CLR_ALL|OS_OPT_PEND_BLOCKING|OS_OPT_PEND_FLAG_CONSUME,(CPU_TS*)0,(OS_ERR*)&err);OSMutexPend (&lock,0,OS_OPT_PEND_BLOCKING,0,&err);while(i<=5){printf("I AM TASK 1!DO INC NOW I= %d\r\n",i++);OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_PERIODIC,&err);//周期性延迟2秒}OSMutexPost(&lock,OS_OPT_POST_NONE,&err);//向事件标志组EventFlags发送标志flags_num=OSFlagPost((OS_FLAG_GRP*)&EventFlags,(OS_FLAGS )EV_FLAG1,(OS_OPT )OS_OPT_POST_FLAG_SET,(OS_ERR* )&err);OSTimeDlyHMSM(0,0,2,0,OS_OPT_TIME_PERIODIC,&err);//周期性延迟2秒}
}
void TaskFunc2(void *tk2){OS_ERR err;while(1){OSFlagPend ((OS_FLAG_GRP *)&EventFlags,(OS_FLAGS)EV_FLAG1,(OS_TICK)0,(OS_OPT)OS_OPT_PEND_FLAG_SET_ALL|OS_OPT_PEND_BLOCKING|OS_OPT_PEND_FLAG_CONSUME,(CPU_TS*)0,(OS_ERR*)&err);OSMutexPend (&lock,0,OS_OPT_PEND_BLOCKING,0,&err);//printf("I AM TASK 2!DO INC NOW I= %d\r\n",i++);printf("六一快乐");i = 0;OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_PERIODIC,&err);//周期性延迟2秒OSMutexPost(&lock,OS_OPT_POST_NONE,&err);//向事件标志组EventFlags发送标志flags_num=OSFlagPost((OS_FLAG_GRP*)&EventFlags,(OS_FLAGS )EV_FLAG1,(OS_OPT )OS_OPT_POST_FLAG_CLR,(OS_ERR* )&err);OSTimeDlyHMSM(0,0,2,0,OS_OPT_TIME_PERIODIC,&err);//周期性延迟2秒}
}int main(void)
{BSP_IntDisAll(); //关闭所有中断 /* Disable all interrupts. */CPU_Init(); /* Initialize the uC/CPU Services */Mem_Init(); /* Initialize Memory Management Module */Math_Init(); /* Initialize Mathematical Module */BSP_Init();BSP_Tick_Init();usart_init();OSInit(&err); /* Init uC/OS-III. */OSSchedRoundRobinCfg(ENABLE,10,&err);//时间片长度OSMutexCreate (&lock,"print_lock",&err);OSFlagCreate (&EventFlags,"test", 0,&err);OSTaskCreate((OS_TCB *)&Task1TCB, /* 创建任务 */(CPU_CHAR *)"TaskFunc1",(OS_TASK_PTR )TaskFunc1,(void *)0u,(OS_PRIO )3,(CPU_STK *)&Task1Stak[0],(CPU_STK_SIZE )10,(CPU_STK_SIZE )100,(OS_MSG_QTY )10u,(OS_TICK )10u,(void *)NULL,(OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),(OS_ERR *)&err);if(err != OS_ERR_NONE){printf("TASK CREATE ERROR!\r\n");}OSTaskCreate((OS_TCB *)&Task2TCB, // 创建任务 (CPU_CHAR *)"TaskFunc2",(OS_TASK_PTR )TaskFunc2,(void *)0u,(OS_PRIO )5,(CPU_STK *)&Task2Stak[0],(CPU_STK_SIZE )10,(CPU_STK_SIZE )100,(OS_MSG_QTY )10u,(OS_TICK )10u,(void *)NULL,(OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),(OS_ERR *)&err);if(err != OS_ERR_NONE){printf("TASK CREATE ERROR!\r\n");}OSStart(&err); //执行任务(休眠区->就绪区)(void)&err;return (0u);
}/*
*********************************************************************************************************
* STARTUP TASK
*
* Description : This is an example of a startup task. As mentioned in the book's text, you MUST
* initialize the ticker only once multitasking has started.
*
* Arguments : p_arg is the argument passed to 'AppTaskStart()' by 'OSTaskCreate()'.
*
* Returns : none
*
* Notes : 1) The first line of code is used to prevent a compiler warning because 'p_arg' is not
* used. The compiler should not generate any code for this statement.
*********************************************************************************************************
*/static void AppTaskStart (void *p_arg)
{OS_ERR err;(void)p_arg;BSP_Init(); /* Initialize BSP functions */BSP_Tick_Init(); /* Initialize Tick Services. */#if OS_CFG_STAT_TASK_EN > 0uOSStatTaskCPUUsageInit(&err); /* Compute CPU capacity with no task running */
#endif#ifdef CPU_CFG_INT_DIS_MEAS_ENCPU_IntDisMeasMaxCurReset();
#endifBSP_LED_Off(0u); /* Turn Off LEDs after initialization */APP_TRACE_DBG(("Creating Application Kernel Objects\n\r"));AppObjCreate(); /* Create Applicaiton kernel objects */APP_TRACE_DBG(("Creating Application Tasks\n\r"));AppTaskCreate(); /* Create Application tasks */while (DEF_TRUE) { /* Task body, always written as an infinite loop. */BSP_LED_Toggle(1u);OSTimeDlyHMSM(0u, 0u, 0u, 100u,OS_OPT_TIME_HMSM_STRICT,&err);BSP_LED_Toggle(2u);OSTimeDlyHMSM(0u, 0u, 0u, 100u,OS_OPT_TIME_HMSM_STRICT,&err);BSP_LED_Toggle(3u);OSTimeDlyHMSM(0u, 0u, 0u, 100u,OS_OPT_TIME_HMSM_STRICT,&err);BSP_LED_Toggle(4u);OSTimeDlyHMSM(0u, 0u, 0u, 100u,OS_OPT_TIME_HMSM_STRICT,&err);}
}/*
*********************************************************************************************************
* AppTaskCreate()
*
* Description : Create application tasks.
*
* Argument(s) : none
*
* Return(s) : none
*
* Caller(s) : AppTaskStart()
*
* Note(s) : none.
*********************************************************************************************************
*/static void AppTaskCreate (void)
{OS_ERR os_err;/* ------------- CREATE FLOATING POINT TASK ----------- */OSTaskCreate((OS_TCB *)&App_TaskEq0FpTCB,(CPU_CHAR *)"FP Equation 1",(OS_TASK_PTR ) App_TaskEq0Fp, (void *) 0,(OS_PRIO ) APP_CFG_TASK_EQ_PRIO,(CPU_STK *)&App_TaskEq0FpStk[0],(CPU_STK_SIZE ) App_TaskEq0FpStk[APP_CFG_TASK_EQ_STK_SIZE / 10u],(CPU_STK_SIZE ) APP_CFG_TASK_EQ_STK_SIZE,(OS_MSG_QTY ) 0u,(OS_TICK ) 0u,(void *) 0,(OS_OPT )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR | OS_OPT_TASK_SAVE_FP),(OS_ERR *)&os_err);
}/*
*********************************************************************************************************
* AppObjCreate()
*
* Description : Create application kernel objects tasks.
*
* Argument(s) : none
*
* Return(s) : none
*
* Caller(s) : AppTaskStart()
*
* Note(s) : none.
*********************************************************************************************************
*/static void AppObjCreate (void)
{}/*
*********************************************************************************************************
* App_TaskEq0Fp()
*
* Description : This task finds the root of the following equation.
* f(x) = e^-x(3.2 sin(x) - 0.5 cos(x)) using the bisection mehtod
*
* Argument(s) : p_arg is the argument passed to 'App_TaskEq0Fp' by 'OSTaskCreate()'.
*
* Return(s) : none.
*
* Note(s) : none.
*********************************************************************************************************
*/void App_TaskEq0Fp (void *p_arg)
{CPU_FP32 a;CPU_FP32 b;CPU_FP32 c;CPU_FP32 eps;CPU_FP32 f_a;CPU_FP32 f_c;CPU_FP32 delta;CPU_INT08U iteration;RAND_NBR wait_cycles;while (DEF_TRUE) {eps = 0.00001;a = 3.0; b = 4.0;delta = a - b;iteration = 0u;if (delta < 0) {delta = delta * -1.0;}while (((2.00 * eps) < delta) || (iteration > 20u )) {c = (a + b) / 2.00;f_a = (exp((-1.0) * a) * (3.2 * sin(a) - 0.5 * cos(a)));f_c = (exp((-1.0) * c) * (3.2 * sin(c) - 0.5 * cos(c)));if (((f_a > 0.0) && (f_c < 0.0)) || ((f_a < 0.0) && (f_c > 0.0))) {b = c;} else if (((f_a > 0.0) && (f_c > 0.0)) || ((f_a < 0.0) && (f_c < 0.0))) {a = c; } else {break;}delta = a - b;if (delta < 0) {delta = delta * -1.0;}iteration++;wait_cycles = Math_Rand();wait_cycles = wait_cycles % 1000;while (wait_cycles > 0u) {wait_cycles--;}if (iteration > APP_TASK_EQ_0_ITERATION_NBR) {APP_TRACE_INFO(("App_TaskEq0Fp() max # iteration reached\n"));break;} }APP_TRACE_INFO(("Eq0 Task Running ....\n"));if (iteration == APP_TASK_EQ_0_ITERATION_NBR) {APP_TRACE_INFO(("Root = %f; f(c) = %f; #iterations : %d\n", c, f_c, iteration));}}
}
相关文章:

Spring学习八
1: Tomcat容器四个等级? Container, Engine, Servlet容器, Context 真正管理Servlet的容器是Context容器:一个context对应一个web工程。 <Context path"/projectOne " docBase"D:\proje…

作业六:图像编码相关概念
7.1.信息量:信息源发出的所有消息中该消息出现概率的倒数的对数。信息熵:对信息源X的各符号的自信息量取统计平均。 7.6如图所示:哈夫曼编码最终结果为:X11,X201,X3000,X4001。编码效率为95%。 7.8根据公式ÿ…

linux命令find命令详解
find 查找文件 find 哪里 什么类型 什么名字 -maxdepth 最大的深度 查找目录的最大深度 find -maxdepth 1 -type d -type 找什么类型的 f file 文件 d directory 目录 -name 什么名字 -mtime 根据修改时间找出对应的文件 7 7天前 -7 7天后 find命令一般与 |xargs 一起…

一次次小进步,从毕业开始,你到现在飞跃了几次了,程序人生也不容易?
01. 会写最简单的程序,能编译通过了,是一次飞跃。02. 会写C/S程序了,能用那些常用的控件,对属性事件有了解了,会用了,是一次飞跃。03. 会写B/S程序了,也是一次飞跃。04. 你彻底理解了分层的理念…

什么是JAVA内容仓库(Java Content Repository)(3)
开发我们的例子程序 jackrabbit已经配置好了,现在让我们来创建我们的示例程序。这个例子程序将调用JCR-170 API。很显然,我们需要做两件事情:一个是作为后台的对数据进行增删改查(持久层),另一个是开发相对…

Cygwin-添加到右键菜单脚本--一键安装、卸载
平时习惯用一些linux命令来完成工作,在Windows上有cygwin和gitbash两个选择。这两个我都装了。 相对来说cygwin支持的功能更多一些,但是它没有默认绑定到右键菜单。为此,我想到用万能的注册表解决这个事情。网上搜索了一下,把我眼…

在博客园安家了
终于找到自己的网上家园了。。哈哈。。 虽然早就注册了博客园,不过一直都在忙。没有时间整理。以后我会把自己学到的东西慢慢的发表到网上,和大家交流。 也会把一些自我感觉经典的东西放在园子中,方便大家学习。 总之,我以后会加油…

mendix归还界面如何只显示登录人自己借阅的书籍,而不显示全部人借阅的书籍
解决方法如下:

***WindowsXP常用的七种方法
第一招、屏幕保护 在Windows中启用了屏幕保护之后,只要我们离开计算机(或者不操作计算机)的时间达到预设的时间,系统就会自动启动屏幕保护程序,而当用户移动鼠标或敲击键盘想返回正常工作状态时,系统就会打开一个密码确认框&#…

小程序全局状态管理,在页面中获取globalData和使用globalSetData
GitHub: https://github.com/WozHuang/mp-extend 主要目标 微信小程序官方没有提供类似vuex、redux全局状态管理的解决方案,但是在一个完整的项目中各组件的数据一致性是必须要保证,因此需要开发一个能够实现小程序全局状态管理的解决方案。 设计思路 参…

谈 三层结构与MVC模式的区别
谈 三层结构与MVC模式的区别 在CSDN和园子里有朋友谈到三层与MVC的区别,以前也有人抛出这个问题,本人对来公司面试的朋友也偶乐会提这方面的问题。 那么我也来讲讲我对这两者的理解吧。 首先对这个题目,本身是存在问题的,…

学习自定义组件
React入门介绍-ReactDOM.render() 蚂蚁设计-组件 React入门-ReactDOM.render()介绍 node.js和npm的关系

如何焊接电路板
今天主要想给大家分享一下焊接电路板的经验,作为一个电子工程师,焊接电路板是一个基本活,要不你很多东西都要麻烦到别人,这样就不好了,而今天要分享的是如何焊接贴片,在焊接从多的电路板中,我想…

加入新e时代建站网后,我可以做什么
加入原动力建站网后,您便开始了自由而浪漫的原动力建站网生活。您可以:选择自由的时间学习,跟您的上级交流,请教;选择自由的时间工作;自由的发展,整个互联网任您自由发挥;从实践中学…

[BZOJ2502]清理雪道 有上下界网络流(最小流)
2502: 清理雪道 Time Limit: 10 Sec Memory Limit: 128 MBDescription 滑雪场坐落在FJ省西北部的若干座山上。从空中鸟瞰,滑雪场可以看作一个有向无环图,每条弧代表一个斜坡(即雪道),弧的方向代表斜坡下降的方向。你的…

学习API网关遇到的名词
VPC浅谈 VPC全称“虚拟私有云”,是一个公共云计算资源的动态配置池。虚拟私有云在概念上类似于虚拟专用网,需要使用加密协议、隧道协议和其他安全程序,在民营企业和云服务提供商之间传输数据。一个虚拟专用网可以被用来在公共网,…

RXJAVA之变换操作
RXJAVA提供了以下变换操作,对Observable的消息进行变换操作: 1.window 定期将来自Observable的数据分拆成一些Observable窗口,然后发射这些窗口,而不是每次发射一项。 Observable<String> observable Observable.just(&quo…

java中xxe漏洞修复方法
java中禁止外部实体引用的设置方法不止一种,这样就导致有些开发者修复的时候采用的错误的方法 之所以写这篇文章是有原因的!最早是有朋友在群里发了如下一个pdf, 而当时已经是2019年1月末了,应该不是2018年7月份那个引起较大轰动的…

模式6--ReadWriteLock
来至《java多线程设计模式》 自己提供一个逻辑锁代替JDK的物理锁synchronized 优点:1.对read操作不进行共享互斥,可以进行多个read操作,提高系统性能 2.适合read》write的情况 package Sample;public final class ReadWriteLock {private int…

使用 XSL 样式表无法查看 XML 输入。请更正错误然后单击 刷新按钮,或以后重试。...
使用 XSL 样式表无法查看 XML 输入。请更正错误然后单击 刷新按钮,或以后重试。 无法显示 XML 页。 使用 XSL 样式表无法查看 XML 输入。请更正错误然后单击 刷新按钮,或以后重试。 ----------------------------------------------------------------…
JDK的安装与系统环境变量的配置
一、下载JDK 用户进入到Java SE的下载网页后,根据自己所用的操作系统(Windows、Linux)和位数(32位、64位)选择不同的链接进行下载。本例是在Windows系统的32位机器上开发的,所以下载的是jdk-8u161-windows-…

docker redis 多个实例
Docker运维笔记-Docker端口映射 - 恶性佛 - CSDN博客https://blog.csdn.net/qq_29994609/article/details/51730640 利用 Docker 在一台机器上部署多个 Redis 实例 - HeatDeath的博客 - CSDN博客https://blog.csdn.net/HeatDeath/article/details/80364340 Docker命令详解 - iV…

Dojo QuickStart 快速入门教程 (1) Why Dojo
Dojo 是一个用来构建 Web 应用的 JavaScript 工具包,当然是开源的。它的目标是通过提供一组特别构造的 API 和一系列辅助工具,使你能在较短的时间里把想法变为实现,同时改善你的日常 Web 开发体验。它是快速的(lightning fast)、健壮的(light…

css3-transform
转载于:https://www.cnblogs.com/cyany/p/7594143.html

C#操作注册表
using Microsoft.Win32 ;以下从‘读’‘写’‘删除’‘判断’四个事例实现对注册表的简单操作 1.读取指定名称的注册表的值 private string GetRegistData(string name) { string registData; RegistryKey hkml Registry.LocalMachine; RegistryKey software hkml.OpenSubKey…

Red Hat Linux 安装教程
一、下载链接 链接:https://pan.baidu.com/s/1JShQmOrgGG5_uaqPUuaHLg 提取码:ture 二、安装步骤 1、打开虚拟机,单击“创建新的虚拟机”; 2、在出现的“新建虚拟机向导”窗口中,选择默认的“典型(推荐&…

Spring中利用applicationContext.xml文件实例化对象和调用方法
Spring中实例化对象和调用方法入门 1.jar包和xml的准备 已上传至百度云盘,链接: https://pan.baidu.com/s/1CY0xQq3GLK06iX7tVLnp3Q 提取码: shjd ; 2.在eclipse中创建javaweb项目 1.第一次创建javaWEB项目操作步骤 1)eclipse中运行javaWE…

图形文件元数据管理工具exiv2
图形文件元数据管理工具exiv2图形文件通常都包含多种元数据,如Exif、IPTC、XMP。这些信息往往是渗透人员收集的目标。为了便于管理这些信息,Kali Linux内置了专用工具exiv2。该工具支持24种文件格式,包括JPEG、TIFF、PNG、GIF、PSD、TGA、BMP…

什么是LAN(局域网)
一、局域网 局域网(Local Area Network),简称LAN,是指在某一区域内由多台计算机互联成的计算机组。“某一区域”指的是同一办公室、同一建筑物、同一公司和同一学校等,一般是方圆几千米以内。局域网可以实现文件管理、…

网络编程-粘包
粘包问题的产生 TCP流式协议 基于数据流的协议 接收方产生粘包问题 1.接收方不清楚数据有多长只接收了数据的一部分 2.接收方多读取了数据 发送方产生的粘包问题 操作系统没有及时发送前一次的数据,导致两次数据粘在一起 粘包问题的根本原因是接收方不清楚数据的长度…