任务与中断共享资源冲突示例
文章目录
- 1 任务与中断共享资源冲突示例
1 任务与中断共享资源冲突示例
演示代码如下:
/*** @brief tOS应用示例* @details* @author 01课堂 李述铜 http://01ketang.cc* @date 2017-06-01* @version 1.0* @copyright 版权所有,禁止用于商业用途*/
#include "tinyOS.h"
#include "app.h"
#include "hal.h"static tTask task1; // 任务1结构
static tTask task2; // 任务2结构
static tTask task3; // 任务3结构
static tTask task4; // 任务4结构static tTaskStack task1Env[TASK1_ENV_SIZE]; // 任务1的堆栈空间
static tTaskStack task2Env[TASK2_ENV_SIZE]; // 任务2的堆栈空间
static tTaskStack task3Env[TASK3_ENV_SIZE]; // 任务3的堆栈空间
static tTaskStack task4Env[TASK4_ENV_SIZE]; // 任务4的堆栈空间int task1Flag; // 用于指示任务运行状态的标志变量
int task2Flag; // 用于指示任务运行状态的标志变量
int task3Flag; // 用于指示任务运行状态的标志变量
int task4Flag; // 用于指示任务运行状态的标志变量tList list; // 中断与任务共享的链表
tNode nodes[20]; // 待插入结点的链表/*** 初始化链表*/
void listInit (void) {int i = 0;tListInit(&list);for (i = 0; i < sizeof(nodes) / sizeof(tNode); i++) {tListAddLast(&list, &nodes[i]);}
}/*** 遍历并打开整个链表*/
void listPrint (void) {uint32_t count = 0;tNode *currentNode = 0;// 遍历整个链表,然后打印出各个结点对应的序号for (currentNode = tListFirst(&list); currentNode != (tNode *) 0; currentNode = tListNext(&list, currentNode)) {xprintf("Node %d\n", count);// 假设在此期间,突然发生了中断。由于中断操作了链表,导致再次返回任务时// 头结点已经从链表中移除。此时,再继续后面的循环发现,currentNode = tListNext(&list, currentNode) 为0// 导致没有办法再扫描链表中后面的其它结点if (count++ == 0) {interruptByIRQ(IRQ_PRIO_HIGH);}}
}/*** 高优先级中断处理函数*/
void IRQHighHandler (void) {// 在中断中,可能会访问链表,然后对链表进行一些修改操作// 比如删除第1个。而如果此时任务恰好在访问第1个结点,则会链表访问混乱,出现错误tListRemoveFirst(&list);
}/*** 任务的运行代码* @param param 任务初始运行参数*/
void task1Entry (void *param) {listInit();listPrint();for (;;) {task1Flag = 1;tTaskDelay(1);task1Flag = 0;tTaskDelay(1);}
}/*** 任务的运行代码* @param param 任务初始运行参数*/
void task2Entry (void *param) {for (;;) {task2Flag = 1;tTaskDelay(1);task2Flag = 0;tTaskDelay(1);}
}/*** 任务的运行代码* @param param 任务初始运行参数*/
void task3Entry (void *param) {for (;;) {task3Flag = 1;tTaskDelay(1);task3Flag = 0;tTaskDelay(1);}
}/*** 任务的运行代码* @param param 任务初始运行参数*/
void task4Entry (void *param) {for (;;) {task4Flag = 1;tTaskDelay(1);task4Flag = 0;tTaskDelay(1);}
}/*** App的初始化*/
void tInitApp (void) {halInit();interruptEnable(IRQ_PRIO_HIGH, 1);tTaskInit(&task1, task1Entry, (void *) 0x0, TASK1_PRIO, task1Env, sizeof(task1Env));tTaskInit(&task2, task2Entry, (void *) 0x0, TASK2_PRIO, task2Env, sizeof(task2Env));tTaskInit(&task3, task3Entry, (void *) 0x0, TASK3_PRIO, task3Env, sizeof(task3Env));tTaskInit(&task4, task4Entry, (void *) 0x0, TASK4_PRIO, task4Env, sizeof(task4Env));
}
参考资料:
- 手把手教你学用嵌入式操作系统
任务与中断共享资源冲突示例相关推荐
- 请求模式解决共享资源冲突
文章目录 1 请求模式解决共享资源冲突 1 请求模式解决共享资源冲突 原有方式: 我们可以对其进行改进,统一处理: 代码如下: /*** @brief tOS应用示例* @details* @auth ...
- 使用关指定中断解决资源冲突问题
文章目录 1 使用关指定中断解决资源冲突问题 1 使用关指定中断解决资源冲突问题 代码如下: 要点说明: 仅用于任务与中断之间共享资源. 另外,我们还需要注意嵌套的问题: 参考资料: 手把手教你学用嵌 ...
- 使用关中断解决资源冲突问题
文章目录 1 使用关中断解决资源冲突问题 1 使用关中断解决资源冲突问题 解决方法如下: 注意事项: 适用于嵌套中断间共享资源: 在开启了中断嵌套后,可能发生嵌套中断访问同一共享资源.此时,也可以使用 ...
- java:多线程的 共享资源冲突问题
一,java中使用Thread类实现多线程. 1,如果有两以上的线程同时访问同一个共享资源,可能造成线程冲突,线程冲突会造成数据丢失.重复等严重问题. 以下通过两个线程同时访问同一个类,来表现线程冲突 ...
- Java-如何解决多线程当中共享资源的冲突问题
解决多线程当中共享资源冲突的问题 1. 冲突问题展示: /** 共享资源冲突的问题*/ class SingleThread implements Runnable {// 共享资源,100张票pri ...
- 程序中任务(中断)间共享资源(临界区)的保护和互斥
一.软件法 1.轮转法 p0 进程:while(turn != 0); //进入区critical section ; //临界区turn = 1; //退出区remainder section; / ...
- 嵌套中断共享资源问题及解决
文章目录 1 嵌套中断共享资源问题及解决 1 嵌套中断共享资源问题及解决 这个问题可以使用三种方式解决: 关总中断. 关指定中断. 请求模式解决嵌套中断共享资源问题. 这里采用关总中断的方式解决,代码 ...
- (uC/OS-II学习笔记)关于共享资源与信号量
uC/os-ii中任务间相互通信的媒介叫做事件. 关于OS_EVENT数据结构 #if (OS_EVENT_EN) && (OS_MAX_EVENTS > 0u)typedef ...
- python多线程资源共享_Python:关于多处理/多线程和共享资源的问题
以下是我目前发现的最简单的多线程示例:import multiprocessing import subprocess def calculate(value): return value * 10 ...
最新文章
- CSRF verification failed. Request aborted. 表单提交方法为POST时的报错
- 关于vs2010编译程序一闪就没的解决办法
- 使用sentinel实现限流
- OO第四单元博客作业
- Inside the C++ Object Model | Outline
- .NET RulesEngine(规则引擎)
- dmsetup remove_all 这命令干啥的_分一个小知识,服务器上的一个解压与压缩文件的命令....
- git ssh配置完后拉取代码_二、windows下使用git拉取github上的项目(通过设置ssh key方式)...
- SQL SERVER 2014无法启动T-SQL调试的解决方法(亲自实践)
- 智慧社区智能化管理系统搭建
- bug解决 2021-09-25 Unity人物动画无法正常播放的问题
- vue实现浏览器桌面通知
- (转)360和腾讯之争,哪个比较痛?
- shell法宝之sed,修改文件内容的好帮手
- PWM控制电机转速、PWM原理
- UCASE() 函数
- js 常用数组操作的方法
- 中国地质大学计算机研究生考试目录,2017年中国地质大学(武汉)资源学院考研专业目录及考试科目...
- MATLAB读取网页内链接,Matlab使用urlread()读取网页乱码问题
- 苹果电脑怎么查保修期?