文章目录

  • 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. 请求模式解决共享资源冲突

    文章目录 1 请求模式解决共享资源冲突 1 请求模式解决共享资源冲突 原有方式: 我们可以对其进行改进,统一处理: 代码如下: /*** @brief tOS应用示例* @details* @auth ...

  2. 使用关指定中断解决资源冲突问题

    文章目录 1 使用关指定中断解决资源冲突问题 1 使用关指定中断解决资源冲突问题 代码如下: 要点说明: 仅用于任务与中断之间共享资源. 另外,我们还需要注意嵌套的问题: 参考资料: 手把手教你学用嵌 ...

  3. 使用关中断解决资源冲突问题

    文章目录 1 使用关中断解决资源冲突问题 1 使用关中断解决资源冲突问题 解决方法如下: 注意事项: 适用于嵌套中断间共享资源: 在开启了中断嵌套后,可能发生嵌套中断访问同一共享资源.此时,也可以使用 ...

  4. java:多线程的 共享资源冲突问题

    一,java中使用Thread类实现多线程. 1,如果有两以上的线程同时访问同一个共享资源,可能造成线程冲突,线程冲突会造成数据丢失.重复等严重问题. 以下通过两个线程同时访问同一个类,来表现线程冲突 ...

  5. Java-如何解决多线程当中共享资源的冲突问题

    解决多线程当中共享资源冲突的问题 1. 冲突问题展示: /** 共享资源冲突的问题*/ class SingleThread implements Runnable {// 共享资源,100张票pri ...

  6. 程序中任务(中断)间共享资源(临界区)的保护和互斥

    一.软件法 1.轮转法 p0 进程:while(turn != 0); //进入区critical section ; //临界区turn = 1; //退出区remainder section; / ...

  7. 嵌套中断共享资源问题及解决

    文章目录 1 嵌套中断共享资源问题及解决 1 嵌套中断共享资源问题及解决 这个问题可以使用三种方式解决: 关总中断. 关指定中断. 请求模式解决嵌套中断共享资源问题. 这里采用关总中断的方式解决,代码 ...

  8. (uC/OS-II学习笔记)关于共享资源与信号量

    uC/os-ii中任务间相互通信的媒介叫做事件. 关于OS_EVENT数据结构 #if (OS_EVENT_EN) && (OS_MAX_EVENTS > 0u)typedef ...

  9. python多线程资源共享_Python:关于多处理/多线程和共享资源的问题

    以下是我目前发现的最简单的多线程示例:import multiprocessing import subprocess def calculate(value): return value * 10 ...

最新文章

  1. CSRF verification failed. Request aborted. 表单提交方法为POST时的报错
  2. 关于vs2010编译程序一闪就没的解决办法
  3. 使用sentinel实现限流
  4. OO第四单元博客作业
  5. Inside the C++ Object Model | Outline
  6. .NET RulesEngine(规则引擎)
  7. dmsetup remove_all 这命令干啥的_分一个小知识,服务器上的一个解压与压缩文件的命令....
  8. git ssh配置完后拉取代码_二、windows下使用git拉取github上的项目(通过设置ssh key方式)...
  9. SQL SERVER 2014无法启动T-SQL调试的解决方法(亲自实践)
  10. 智慧社区智能化管理系统搭建
  11. bug解决 2021-09-25 Unity人物动画无法正常播放的问题
  12. vue实现浏览器桌面通知
  13. (转)360和腾讯之争,哪个比较痛?
  14. shell法宝之sed,修改文件内容的好帮手
  15. PWM控制电机转速、PWM原理
  16. UCASE() 函数
  17. js 常用数组操作的方法
  18. 中国地质大学计算机研究生考试目录,2017年中国地质大学(武汉)资源学院考研专业目录及考试科目...
  19. MATLAB读取网页内链接,Matlab使用urlread()读取网页乱码问题
  20. 苹果电脑怎么查保修期?

热门文章

  1. 一起学nRF51xx 13 - twi iic
  2. 【工具】更新最新esp8266库离线安装包3.0.1、ESP32库离线安装包1.0.6
  3. BRCM5.02编译十:cmake: command not found
  4. Confluence 6 授权
  5. 中国的程序员们是否要声援微软小冰?
  6. linux上安装配置vsftpd
  7. 【MongoDB学习笔记7】深入MongoDB的删除(remove/drop)操作
  8. web页面事件无响应,元素点击不到
  9. 。net面试题(2)
  10. 策略模式的扩展——策略枚举