FREERTOS 移植到ARM Cortex-A9

触发任务调度的机制有两种中断;
1.OSTaskRun/OSTaskSaveRun/OSTaskLoadRun/OSTaskSaveLoadRun
这种机制是通过调用软中断ARM SWI异常触发任务切换。
调用软中断:

#define OSTaskRun(PRunTcb)  osek_switch_type = 1; __asm volatile ( "SWI 0");
#define OSTaskSaveRun(PSavedTcb,PRunTcb) osek_switch_type = 1; __asm volatile ( "SWI 0");
#define OSTaskLoadRun(PRunTcb)  osek_switch_type = 0; __asm volatile ( "SWI 0");
#define OSTaskSaveLoadRun(PSavedTcb,PRunTcb) osek_switch_type=0; __asm volatile ( "SWI 0");

软中断响应:

.align 4
.type OSEK_SWI_Handler, %function
OSEK_SWI_Handler:                   /* SWI vector handler */portSAVE_CONTEXTLDR R0, InitTaskConstBLX    R0portRESTORE_CONTEXT

软中断只能在用户程序中调用,如任务自结束后调度下一个任务TerminateTask,而不能在中断程序里直接调用软中断进行上下文切换;由于Darwin OSEK不使用循环嵌套,在需要做任务切换的地方不能直接在一个中断里面直接调用SWI中断,此时应该采用第2种IRQ handler方式。即不允许在一类中断中发生任务调度,例如一类中断过程中出现二类中断,此时二类中断激活了某个较高优先级的任务T,任务状态从suspended变为ready,但此时任务T不能被任务调度器调度,只能等到下一调度节点才能被调度。在Darwin2 OSEK里没有使用中断嵌套,如图1在timer中断通过调用软中断__asm volatile ( “SWI 0”)试图调度任务是不被允许的,因为此次timer中断流程还没有跑完,有些资源还在临界区,如果直接进入另一个中断,会导致临界区资源没有同步。正确的做法是在此次timer中断中只是把任务激活,把此次timer中断的流程走完,然后等待下一个调度点再调度任务,例如图2的在IRQ中断中调度任务;

2.IRQ handler
通过tick中断来检测是否需要进行任务切换,检测频率为1ms。在处理IRQ中断时,检测isScheduleRequired是否需要切换,如果需要切换就跳转到切换处理程序switch_before_exit;而isScheduleRequired是在任务激活且需要做任务切换的地方打开的,如OSActivateTask和OSSetEvent。

.align 4
.type OSEK_IRQ_Handler, %function
OSEK_IRQ_Handler:                   /* SWI vector handler */
........ // 其他处理LDR     r1, =isScheduleRequiredLDR     r0, [r1]CMP     r0, #0BNE       switch_before_exit

任务调度管理-触发任务调度的机制相关推荐

  1. Quartz高效的任务调度管理工具(是什么以及如何使用)

    什么是Quartz quartz:石英钟的意思 是一个当今市面上流行的高效的任务调度管理工具 所谓"调度"就是制定好的什么时间做什么事情的计划 由OpenSymphony开源组织开 ...

  2. 管理进程和任务调度管理

    进程管理的作用 1)判断服务器的健康状态 进程管理最主要的工作就是判断服务器当前运行是否健康,是否需要人为干预.如果服务器的 CPU 占用率.内存占用率过高,就需要人为介入解决问题了. 2)  查看系 ...

  3. python内存的回收机制_python的内存管理和垃圾回收机制详解

    简单来说python的内存管理机制有三种 1)引用计数 2)垃圾回收 3)内存池 接下来我们来详细讲解这三种管理机制 1,引用计数: 引用计数是一种非常高效的内存管理手段,当一个pyhton对象被引用 ...

  4. JVM原理(Java代码编译和执行的整个过程+JVM内存管理及垃圾回收机制)

    转载注明出处: http://blog.csdn.net/cutesource/article/details/5904501 JVM工作原理和特点主要是指操作系统装入JVM是通过jdk中Java.e ...

  5. 详解JVM内存管理与垃圾回收机制2 - 何为垃圾

    随着编程语言的发展,GC的功能不断增强,性能也不断提高,作为语言背后的无名英雄,GC离我们的工作似乎越来越远.作为Java程序员,对这一点也许会有更深的体会,我们不需要了解太多与GC相关的知识,就能很 ...

  6. Python内存管理以及垃圾回收机制

    垃圾回收:用通俗点的语言解释就是内存管理和垃圾回收的过程. 大管家refchain 在Python的C源码中有一个名为refchain的环状双向链表,这个链表就比较厉害了,因为Python程序中一旦创 ...

  7. 详解JVM内存管理与垃圾回收机制5 - Java中的4种引用类型

    在Java语言中,除了基础数据类型的变量以外,其他的都是引用类型,指向各种不同的对象.在前文我们也已经知道,Java中的引用可以是认为对指针的封装,这个指针中存储的值代表的是另外一块内存的起始地址(对 ...

  8. Android权限管理之Permission权限机制及使用

    前言: 最近突然喜欢上一句诗:"宠辱不惊,看庭前花开花落:去留无意,望天空云卷云舒." 哈哈~,这个和今天的主题无关,最近只要不学习总觉得生活中少了点什么,所以想着围绕着最近面试过 ...

  9. kafka中的配额管理(限速)机制

    kafka中的配额管理(限速)机制 kafka支持配额管理,从而可以对Producer和Consumer的produce&fetch操作进行流量限制,防止个别业务压爆服务器.本文主要介绍如何使 ...

最新文章

  1. diy一下devise的验证
  2. redis 慢查询日志
  3. 1273 - Unknown collation: 'utf8mb4_0900_ai_ci'
  4. IDEA Git更新
  5. 写一篇好的技术文章有多难?
  6. Linux tmux
  7. ZeroMemory(百度百科 ZeroMemory)
  8. python程序设计实验七_Python程序设计实验报告七:组合数据类型
  9. 10月31 安装redis报错
  10. 重装系统解决:CUPS服务未启动,不能管理打印机
  11. c++ idea 插件_idea快速开发插件
  12. setprecision、setw、fixed详解
  13. 侏罗纪开发实施工作管理平台
  14. ABP-Hangfire定时任务
  15. firefly-rk3288j开发板 eDP实验之NV101WXM-N51显示屏驱动
  16. URL请求加密 参数的sign签名 与验签
  17. 法国5G网络将在2020推出
  18. 哪位神犇可以帮忙啊。
  19. dell服务器经常自动关机,戴尔15R电脑win10系统总是自动关机?
  20. ArcGIS 同一要素图层合并

热门文章

  1. golang mysql 崩溃_使用GoLang与mysql连接失败
  2. 厉害了,学霸利用贪心算法找偷车贼
  3. 三行代码,可以让你电脑崩溃!
  4. 陆白_淘宝电商代运营
  5. javaweb基于SSM框架的书籍小说在线阅读下载网站
  6. 【C#进阶四】详细总结C#中的文件和I/O流之文件和目录(File 、 FileInfo、Directory、DirectoryInfo和Path)
  7. 教授专栏33 | 黄阳光: 投资初创企业,应如何配置资源?
  8. html关于布局的说法错误的是,关于可迁移技能以下说法错误的是
  9. 江苏省计算机二级高级office知识点,计算机二级高级Office常见知识点积累
  10. MATLAB对水下目标去噪声代码,水下目标噪声与背景噪声的建模与仿真