当前位置: 首页 > 编程日记 > 正文

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&#xff1a; Tomcat容器四个等级&#xff1f; Container&#xff0c; Engine&#xff0c; Servlet容器&#xff0c; Context 真正管理Servlet的容器是Context容器&#xff1a;一个context对应一个web工程。 <Context path"/projectOne " docBase"D:\proje…

作业六:图像编码相关概念

7.1&#xff0e;信息量&#xff1a;信息源发出的所有消息中该消息出现概率的倒数的对数。信息熵&#xff1a;对信息源X的各符号的自信息量取统计平均。 7.6如图所示&#xff1a;哈夫曼编码最终结果为&#xff1a;X11,X201,X3000,X4001。编码效率为95%。 7.8根据公式&#xff…

linux命令find命令详解

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

一次次小进步,从毕业开始,你到现在飞跃了几次了,程序人生也不容易?

01. 会写最简单的程序&#xff0c;能编译通过了&#xff0c;是一次飞跃。02. 会写C/S程序了&#xff0c;能用那些常用的控件&#xff0c;对属性事件有了解了&#xff0c;会用了&#xff0c;是一次飞跃。03. 会写B/S程序了&#xff0c;也是一次飞跃。04. 你彻底理解了分层的理念…

什么是JAVA内容仓库(Java Content Repository)(3)

开发我们的例子程序 jackrabbit已经配置好了&#xff0c;现在让我们来创建我们的示例程序。这个例子程序将调用JCR-170 API。很显然&#xff0c;我们需要做两件事情&#xff1a;一个是作为后台的对数据进行增删改查&#xff08;持久层&#xff09;&#xff0c;另一个是开发相对…

Cygwin-添加到右键菜单脚本--一键安装、卸载

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

在博客园安家了

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

***WindowsXP常用的七种方法

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

小程序全局状态管理,在页面中获取globalData和使用globalSetData

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

谈 三层结构与MVC模式的区别

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

学习自定义组件

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

如何焊接电路板

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

加入新e时代建站网后,我可以做什么

加入原动力建站网后&#xff0c;您便开始了自由而浪漫的原动力建站网生活。您可以&#xff1a;选择自由的时间学习&#xff0c;跟您的上级交流&#xff0c;请教&#xff1b;选择自由的时间工作&#xff1b;自由的发展&#xff0c;整个互联网任您自由发挥&#xff1b;从实践中学…

[BZOJ2502]清理雪道 有上下界网络流(最小流)

2502: 清理雪道 Time Limit: 10 Sec Memory Limit: 128 MBDescription 滑雪场坐落在FJ省西北部的若干座山上。从空中鸟瞰&#xff0c;滑雪场可以看作一个有向无环图&#xff0c;每条弧代表一个斜坡&#xff08;即雪道&#xff09;&#xff0c;弧的方向代表斜坡下降的方向。你的…

学习API网关遇到的名词

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

RXJAVA之变换操作

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

java中xxe漏洞修复方法

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

模式6--ReadWriteLock

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

使用 XSL 样式表无法查看 XML 输入。请更正错误然后单击 刷新按钮,或以后重试。...

使用 XSL 样式表无法查看 XML 输入。请更正错误然后单击 刷新按钮&#xff0c;或以后重试。 无法显示 XML 页。 使用 XSL 样式表无法查看 XML 输入。请更正错误然后单击 刷新按钮&#xff0c;或以后重试。 ----------------------------------------------------------------…

JDK的安装与系统环境变量的配置

一、下载JDK 用户进入到Java SE的下载网页后&#xff0c;根据自己所用的操作系统&#xff08;Windows、Linux&#xff09;和位数&#xff08;32位、64位&#xff09;选择不同的链接进行下载。本例是在Windows系统的32位机器上开发的&#xff0c;所以下载的是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 工具包&#xff0c;当然是开源的。它的目标是通过提供一组特别构造的 API 和一系列辅助工具&#xff0c;使你能在较短的时间里把想法变为实现&#xff0c;同时改善你的日常 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 安装教程

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

Spring中利用applicationContext.xml文件实例化对象和调用方法

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

图形文件元数据管理工具exiv2

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

什么是LAN(局域网)

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

网络编程-粘包

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