【iCore4 双核心板_uC/OS-II】例程三:任务的挂起与恢复
一、实验说明:
当一个任务正在运行的时候,由于某种情况可能需要终止运行一段时间,终止的这段时间就是
所谓的任务的挂起,可以由该任务自身或者其他任务来挂起一个任务。当被挂起的任务需要再次运
行的时候,可以恢复被挂起的任务。本实验中红灯和绿灯以固定频率闪烁,当任务寄存器的值达到5
的时候,挂起绿灯闪烁任务,只剩下红灯闪烁,当任务寄存器的值达到10的时候,被挂起的绿灯闪
烁任务恢复,红灯和绿灯又同时闪烁,如此循环往复。
二、实验截图:
三、源代码下载链接:
链接:https://pan.baidu.com/s/1nwdjym1 密码:ugo5
四、核心代码:
- /*
- * Name : main
- * Description : ---
- * Author : zh.
- *
- * History
- * --------------------
- * Rev : 0.00
- * Date : 07/12/2017
- *
- * create.
- * --------------------
- */
- /*实验现象:
- 最开始红灯和绿灯同时以固定频率闪烁,当任务寄存器的值达到5的时候,
- 挂起绿灯闪烁任务,只剩红灯闪烁;当任务寄存器值达到10的时候,被挂
- 起的绿灯闪烁任务恢复,红灯和绿灯又同时闪烁,如此循环往复。
- */
- int main(void)
- {
- system_clock.initialize(); //系统时钟初始化
- led.initialize(); //LED初始化
- usart6.initialize(); //串口初始化
- usart6.printf("\x0c"); //清屏
- usart6.printf("\033[1;32;40m"); //设置字体终端为绿色
- usart6.printf("\r\nHello, 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;
- OSStatInit();//初始化统计任务
- OS_ENTER_CRITICAL();//关中断
- OSTaskCreate(led0_task,(void*),(OS_STK*)&LED0_TASK_STK[LED0_STK_SIZE-],LED0_TASK_PRIO);//创建LED0任务
- OSTaskCreate(led1_task,(void*),(OS_STK*)&LED1_TASK_STK[LED1_STK_SIZE-],LED1_TASK_PRIO);//创建LED1任务
- OSTaskCreate(usart_task,(void*),(OS_STK*)&USART_TASK_STK[USART_STK_SIZE-],USART_TASK_PRIO);//创建usart任务
- 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 led0_task(void *pdata)
- {
- INT8U err; //定义错误类型
- INT8U value; //定义寄存器的值
- while(){
- usart6.printf("The task1 is running.\r\n");
- value = OSTaskRegGet ( , , & err ); //获取该任务寄存器的值
- if( value < ){
- OSTaskRegSet ( , , ++ value, & err );//寄存器的值加一
- }else{
- OSTaskRegSet ( , , , & err ); //寄存器值置零
- OSTaskResume (LED1_TASK_PRIO); //恢复绿灯LED闪烁的任务
- }
- 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 led1_task(void *pdata)
- {
- INT8U err; //定义错误类型
- INT8U value; //定义寄存器的值
- while(){
- usart6.printf("The task2 is running.\r\n");
- value = OSTaskRegGet ( , , & err ); //获取该任务寄存器的值
- if ( value < ){
- OSTaskRegSet ( , , ++ value, & err );//寄存器的值加一
- }else{
- OSTaskRegSet ( , , , & err ); //任务寄存器清0 //寄存器值置零
- OSTaskSuspend (LED1_TASK_PRIO); //挂起自身任务 //挂起自身任务
- }
- LED_GREEN_ON; //绿灯亮
- OSTimeDlyHMSM(,,,); //延时1000ms
- LED_GREEN_OFF; //绿灯灭
- OSTimeDlyHMSM(,,,); //延时1000ms
- }
- }
- /*
- * Name : usart_task
- * Description : ---
- * Author : liu.
- *
- * History
- * --------------------
- * Rev : 0.00
- * Date : 07/12/2017
- *
- * create.
- * --------------------
- */
- void usart_task(void *pdata)
- {
- double f=0.1;
- while(){
- usart6.printf("The task3 is running.\r\n");
- f+=0.1f; //浮点型运算
- usart6.printf("float f=%.4f\r\n",f); //串口输出
- OSTimeDlyHMSM(,,,); //延时1000ms
- }
- }
iCore4链接:
【iCore4 双核心板_uC/OS-II】例程三:任务的挂起与恢复的更多相关文章
- 【iCore4 双核心板_uC/OS-II】例程四:软件定时器
一.实验说明: 一些应用程序执行它们的任务时需要延迟一段特定的时间,因此uC/OS-II为我们提供了一些相应的 延时函数,本例程我们使用软件定时器定时500ms点亮相应的LED实现三色LED循环闪烁. ...
- 【iCore4 双核心板_uC/OS-II】例程二:任务的建立与删除
一.实验说明: 本例程建立三个任务,通过任务寄存器来实现任务的建立与删除功能.红灯和绿灯同时以固定 频率闪烁,当任务寄存器为5时,删除绿灯闪烁的任务LED1,此时只有红灯闪烁,当任务寄存器的 值为10 ...
- 【iCore4 双核心板_uC/OS-II】例程十一:内存管理
一.实验说明: 应用程序在运行中为了某种特殊需要,经常需要临时获得一些内存空间.而作为比较完善的操作系统uC/OS-II,也具有动态分配内存的能力. uC/OS-II对内存进行两级管理:把连续内存分成 ...
- 【iCore4 双核心板_uC/OS-II】例程十:信号量集
一.实验说明: 在实际应用中,任务常常需要与多个事件同步,即要根据多个信号量组合作用的结果来决定任务的运行方式.UCOSII为了实现多个信号量组合的功能定义了一种特殊的数据结构——信号量集. 二.实验 ...
- 【iCore4 双核心板_uC/OS-II】例程九:消息队列
一.实验说明: 前面介绍通过信息传递可以进行任务间的交流,信息也可以直接发送给一个任务,在uC/OS-II中每一个任务在它们内部都有一个消息队列,也即任务消息队列,用户可以直接给一个任务发送消息,不需 ...
- 【iCore4 双核心板_uC/OS-II】例程八:消息邮箱
一.实验说明: 消息邮箱是uC/OS-II中的另一种通信机制,可以使一个任务或者中断服务子程序向另一个任务发送一个指针型的变量.通常该指针指向一个包含了“消息”的特定数据结构. 二.实验截图: ...
- 【iCore4 双核心板_uC/OS-II】例程七:互斥信号量
一.实验说明: 在介绍互斥信号量前,我们先简单地描述一下什么是优先级反转.使用实时内核心,优先级反转问题是实时系统中出现得最多的问题.假设任务H优先级高于任务M,任务M优先级高于任务L.任务H和任务M ...
- 【iCore4 双核心板_uC/OS-II】例程六:信号量——任务同步
一.实验说明: 信号量是一个多任务内核提出的一个协议机构,上一个实验中我们介绍了信号量访问共享资源 的功能,其实信号量最初是用来控制访问共享资源的,它还可以用来同步一个中断服务函数和一个任 务,或者同 ...
- 【iCore4 双核心板_uC/OS-II】例程五:信号量——共享资源
一.实验说明: 信号量是操作系统中的一类事件,是实现任务间通信的一个中间环节.当系统中的多个任务 在运行时,经常需要互相无冲突地访问同一个资源,或者需要互相支持的依赖,甚至有时还要互 相加以必要的限制 ...
随机推荐
- Java(Android)线程池zz
介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端执行一个异步任务你还只是如下new T ...
- codeforces651----A. Joysticks
//贪心,注意特判即可 #include <iostream> using namespace std; int main() { ; cin >> a >> b; ...
- luffy项目的接口开发
处理跨域请求 主要的思路: 设置一个基于CORS的中间件来处理,关于跨域的产生与处理手段 settings.py: MIDDLEWARE = [ 'django.middleware.security ...
- 编程菜鸟的日记-初学尝试编程-C++ Primer Plus 第4章编程练习1
#include <iostream>//#include <string>using namespace std;struct stu{ char fname[10];//这 ...
- Java 多线程 重入锁
作为关键字synchronized的替代品(或者说是增强版),重入锁是synchronized的功能扩展.在JDK 1.5的早期版本中,重入锁的性能远远好于synchronized,但从JDK 1.6 ...
- Mac下多个jdk自由切换
1.缘由,某些场合下需特别配置jdk,如最近学习遇到 annotation注解支持jdk1.5以上版本,而我用的jdk1.8,导致tomcat启动失败,提示降低jdk版本到1.7,1.6 2.搜索ma ...
- JS_高程2.在HTML中使用Javascript(2)
1.延迟脚本defer 在<script>元素中设置defer属性,相当于告诉浏览器立即下载,但是延迟执行.<script>中的脚本会延迟到浏览器遇到</html> ...
- openstack 之~keystone之网关协议
第一:静态页面和动态页面 上一篇博客介绍了HTTP后,我们知道一个web server的本质就是 浏览器发送一个HTTP请求: 服务器收到请求,生成一个HTML文档: 服务器把HTML文档作为HTTP ...
- cto职责
http://www.sohu.com/a/209574647_505825 https://mp.weixin.qq.com/s?src=3×tamp=1513066866& ...
- Exception in thread "main" java.lang.StackOverflowError at java.util.ArrayList$SubList.rangeCheckForAdd(Unknown Source)
Exception in thread "main" java.lang.StackOverflowError at java.util.ArrayList$SubList.ran ...