ucos的中断向量表构建

uCOS-II的中断与时钟 uCOS-II的中断与时钟 uCOS-II的中断 概念 暂停当前的程序,转而处理异步事件,处理完毕后,再返回原来的程序继续执行的过程叫做中断;应中断请求,运行的程序叫做中断服务子程序(Interrupt Service Routines,ISR);中断服务程序的入口地址叫做中断向量。 中断过程 如果μC/OS-Ⅱ系统收到中断请求,若处理器当前处于中断允许的状态,则系统停 阅读详情

今天又review了一下以前写过的ucos代码,发现ucos在重新setup中断向量表的操作xxxx

void OS_CPU_InitExceptVect (void)
{
    (*(INT32U *)OS_CPU_ARM_EXCEPT_UNDEF_INSTR_VECT_ADDR)       =         OS_CPU_ARM_INSTR_JUMP_TO_HANDLER;
    (*(INT32U *)OS_CPU_ARM_EXCEPT_UNDEF_INSTR_HANDLER_ADDR)    = (INT32U)OS_CPU_ARM_ExceptUndefInstrHndlr;

    (*(INT32U *)OS_CPU_ARM_EXCEPT_SWI_VECT_ADDR)               =         OS_CPU_ARM_INSTR_JUMP_TO_HANDLER;
    (*(INT32U *)OS_CPU_ARM_EXCEPT_SWI_HANDLER_ADDR)            = (INT32U)OS_CPU_ARM_ExceptSwiHndlr;

    (*(INT32U *)OS_CPU_ARM_EXCEPT_PREFETCH_ABORT_VECT_ADDR)    =         OS_CPU_ARM_INSTR_JUMP_TO_HANDLER;
    (*(INT32U *)OS_CPU_ARM_EXCEPT_PREFETCH_ABORT_HANDLER_ADDR) = (INT32U)OS_CPU_ARM_ExceptPrefetchAbortHndlr;

    (*(INT32U *)OS_CPU_ARM_EXCEPT_DATA_ABORT_VECT_ADDR)        =         OS_CPU_ARM_INSTR_JUMP_TO_HANDLER;
    (*(INT32U *)OS_CPU_ARM_EXCEPT_DATA_ABORT_HANDLER_ADDR)     = (INT32U)OS_CPU_ARM_ExceptDataAbortHndlr;

    (*(INT32U *)OS_CPU_ARM_EXCEPT_ADDR_ABORT_VECT_ADDR)        =         OS_CPU_ARM_INSTR_JUMP_TO_HANDLER;
    (*(INT32U *)OS_CPU_ARM_EXCEPT_ADDR_ABORT_HANDLER_ADDR)     = (INT32U)OS_CPU_ARM_ExceptAddrAbortHndlr;

    (*(INT32U *)OS_CPU_ARM_EXCEPT_IRQ_VECT_ADDR)               =         OS_CPU_ARM_INSTR_JUMP_TO_HANDLER;
    (*(INT32U *)OS_CPU_ARM_EXCEPT_IRQ_HANDLER_ADDR)            = (INT32U)OS_CPU_ARM_ExceptIrqHndlr;

    (*(INT32U *)OS_CPU_ARM_EXCEPT_FIQ_VECT_ADDR)               =         OS_CPU_ARM_INSTR_JUMP_TO_HANDLER;
    (*(INT32U *)OS_CPU_ARM_EXCEPT_FIQ_HANDLER_ADDR)            = (INT32U)OS_CPU_ARM_ExceptFiqHndlr;
}

大多数ARM 处理器都支持把RAM remap 到0x00000000 的地址上来,这样就给了重构中断向量提供了可能

ucos里通过调用这个函数就可以重新初始化0x00000000-0x0000003f 这段ram的内容,实际就是重构中断向量表.

以irq中断向量来说:

(*(INT32U *)OS_CPU_ARM_EXCEPT_IRQ_VECT_ADDR)               =         OS_CPU_ARM_INSTR_JUMP_TO_HANDLER;
    (*(INT32U *)OS_CPU_ARM_EXCEPT_IRQ_HANDLER_ADDR)            = (INT32U)OS_CPU_ARM_ExceptIrqHndlr;

#define OS_CPU_ARM_INSTR_JUMP_TO_HANDLER                0xE59FF018

OS_CPU_ARM_ExceptIrqHndlr //是ucos core中的一小段用asm写的irq例程.相当于函数入口地址

#define OS_CPU_ARM_EXCEPT_IRQ_VECT_ADDR      (OS_CPU_ARM_EXCEPT_IRQ            * 0x04 + 0x00)

#define OS_CPU_ARM_EXCEPT_IRQ_HANDLER_ADDR             (OS_CPU_ARM_EXCEPT_IRQ            * 0x04 + 0x20)

#define OS_CPU_ARM_EXCEPT_IRQ         0x06 //irq 在8个中断向量里是number6,reset 是number0

先在irq 所在的number6中断向量上(地址是0x00000018) 写入   " 0xE59FF018" 这样一个指令(LDR PC,[PC,0x18] 的指令码)

然后在 0x00000018+0x20 的地址处填上 ucos core 函数OS_CPU_ARM_ExceptIrqHndlr 的地址.

这样在产生irq中断后,PC会被弹到 0x00000018 来取指“0xE59FF018” 执行LDR PC,[PC,0x18] 的操作

这里 pc+0x18 的 位置正好是填充OS_CPU_ARM_ExceptIrqHndlr 的位置,使PC获得OS_CPU_ARM_ExceptIrqHndlr 的入口地址,然后调转过去,执行这个函数(实际是asm代码段)

在OS_CPU_ARM_ExceptIrqHndlr() 函数里

ucos会做保存上下文的操作,然后调用一个叫OS_CPU_ExceptHndlr的函数,这个函数实际上就是给用户中断处理程序的接口函数(call back),用户在自己的BSP c代码里要实现这个函数 完成针对于自己处理器中断控制器的ISR例程。

这个函数原型是,

void OS_CPU_ExceptHndlr (CPU_DATA except_type)

参数except_type 在asm里由R0传递过来,

值可能为:

#define OS_CPU_ARM_EXCEPT_RESET                                                                    0x00
#define OS_CPU_ARM_EXCEPT_UNDEF_INSTR                                                              0x01
#define OS_CPU_ARM_EXCEPT_SWI                                                                      0x02
#define OS_CPU_ARM_EXCEPT_PREFETCH_ABORT                                                           0x03
#define OS_CPU_ARM_EXCEPT_DATA_ABORT                                                               0x04
#define OS_CPU_ARM_EXCEPT_ADDR_ABORT                                                               0x05
#define OS_CPU_ARM_EXCEPT_IRQ                                                                      0x06
#define OS_CPU_ARM_EXCEPT_FIQ                                                                      0x07
#define OS_CPU_ARM_EXCEPT_NBR                                                                      0x08

其实就是那8个中断向量number, 对于irq来说 是number6

--------------------------

这一点在ucos AN-1014 datasheet上也说得很

Below is the sequence of events that take place when an IRQ occurs
(assuming the I-bit in the CPSR is 0):
The CPU switches mode to IRQ mode (MODE = 0x12);
The CPSR is saved into the SPSR_irq register;
The return address PC is saved into R14_irq (i.e. the Link Register of the IRQ mode);
The I-bit of the CPSR is set to 1 disabling further IRQs;
The PC is forced to address 0x00000018;
The PC is loaded with the address of OS_CPU_ARM_ExceptIrqHndlr() because of the
LDR PC,[PC,#0x18] instruction that we placed at address 0x00000018.
The CPU executes the code in OS_CPU_ARM_ExceptIrqHndlr(), then
OS_CPU_ARM_ExceptHndlr() (found in OS_CPU_A.S).
OS_CPU_ARM_ExceptHndlr() calls OS_CPU_ExceptHndlr() (found in BSP.C) to
determine the source of the interrupt and handle it accordingly.
When OS_CPU_ARM_ExceptHndlr() returns from OS_CPU_ExceptHndlr(), it calls
OSIntExit() (in case of task interrupted) which determines whether there has been a
more important task that has been made ready to run by the exception handler or,
whether we simply need to return to the interrupted task.
If the interrupted task is still the highest priority task, OSIntExit() returns to
OS_CPU_ARM_ExceptHndlr() which simply returns to this task.
If there is a more important task, OSIntExit() calls OSIntCtxSw() (see OS_CPU_A.S) which
takes care of switching to the more important task.

uCOS-II在STM32F103ZET6上的移植(一) 使用的是micrium 官方移植包。 阅读详情

相关推荐

STM32与UCOS结合实现循迹避障小车

STM32微控制器是STMicroelectronics公司生产的一种基于ARM Cortex-M系列处理器的32位微控制器,广泛应用于各种嵌入式系统和物联网项目。其主要特点包括高性能处理能力、低功耗设计、丰富的外设接口以及高集成度,这些特点使得STM32成为嵌入式开发者的首选平台之一。μC/OS,即微控制器实时操作系统(Micro Controller Operating System),是一个针对嵌入式应用设计的抢占式多任务实时内核。

weixin_36178216的博客 1347

S3C2440的Keil启动文件S3C2440.s添加中断配置

参考文档 S3C2440之MMU驱动代码模板 keil下基于arm9的TX2440开发板的外部中断编写 S3C2440中断过程详解(ADS,TQ2440) mini2440—–keil for ARM之中断一 前言 本文主要描述如何在Keil自带的S3C2440.s文件中添加中断配置及中断地址映射,从而可以在中断产生时跳转到用户代码中的中断服务函数。目前在TQ2440开发板是实测可用。 工程源代码...

helloshijie_c的博客 1161

深入探究XGate在UCOS中的tick实现

安装XGate软件包之后,可以根据不同的开发需求对配置参数进行调整。这些配置参数通常位于XGate源代码目录下的config文件夹中。通过修改这些参数,开发者能够定制XGate的行为,例如内存使用大小、任务调度策略等。# 进入config文件夹查看所有可配置的选项ls配置参数的修改通常通过命令行的方式进行,也可以直接编辑参数文件。例如:该命令中用于开启或关闭任务调度功能,用于设置XGate可用的最大内存大小。

weixin_35592186的博客 1321

uCos-II原理与ARM应用程序设计(一)

1、将uCos-II移植到ARM9开发板上 1)搞清应用程序(user子目录)、uCos-II内核文件(ucosii目录)、移植文件(ports子目录)和BSP(ports子目录)之间的关系。 2)移植文件(ports子目录文件)介绍 bsp.h:宏定义一些芯片外设寄存器地址和自定义函数声明; bsp.c:OS_CPU_ExceptHndlr...

weixin_33701617的博客 187

uCOS超小型实时操作系统源代码剖析

本文还有配套的精品资源,点击获取 简介:uCOS,也称为uC/OS,是一款专为微控制器设计的实时操作系统,以小型、高效率和良好的可移植性著称。文章详细解析了uCOS的核心部分,重点讨论了其在蓝牙4.0设备中的应用。uCOS源代码包括CPU初始化、核心功能实现以及API接口定义,支持任务管理、内存管理和时间管理。它还适用于低功耗蓝牙4.0设备,能够支持多任务环境并优化功耗。通...

weixin_32535825的博客 2041

深入探索实时操作系统uCOS-II的设计与应用

本文还有配套的精品资源,点击获取 简介:本书系统地介绍了实时操作系统(RTOS)的设计和使用,特别是uCOS-II的核心概念和机制。uCOS-II是一个针对资源有限的嵌入式设备设计的高效实时操作系统内核,涉及任务调度、内存管理、任务间通信以及中断处理等关键技术。本书详细阐释了uCOS-II的优先级调度、内存管理、同步机制、中断处理、定时器服务等关键组成部分,并介绍了其在多种...

weixin_32661831的博客 1068

ARM异常向量表详解

ARM指令是三级流水线 就是说取指,译指,执行时同时执行的 这样说吧,现在PC指向的是正在取指的地址,那么cpu正在译指的指令地址是PC-4(假设在ARM状态下,一个指令占4个字节),cpu正在执行的指令地址是PC-8. 比如有一个向量表定义如下: unsigned int const vecTbl[16] @".arm_vectors" = { 0xE59FF018, 0xE59FF018, 0xE59FF018, 0xE59FF018, 0xE59FF018, 0xE59FF018, 0xE59FF01

单个的人是软弱无力的,就像漂流的鲁滨孙一样,只有同别人在一起,他才能完成许多事业 1690

abb机器人指令手册_ABB机器人配置圆形输送链跟踪

更多内容请点击上方ABB机器人实战技巧关注也可点击公众号下方往期经典浏览更多内容转载请先后台留言,大家一起支持原创,推动机器人使用和发展本公众号对各类ABB机器人应用,仿真,毕业设计提供技术支持,详细后台留言本公众号诚挚希望与各机器人培训机构,机器人使用单元合作,提供技术支持,详细后台留言1. 通常的机器人输送链跟踪,均为直线输送链跟踪,例如下图2. 有些情况,输送链为圆形,例如...

weixin_39849894的博客 2045

NUC970(ARM9) UCOSIII移植

ARM9与 A7移植差不多,都比STM32简单,区别在于ARM9开关中断不一样,一些新指令不支持,并且NUC970没有VFP,无法使用硬件浮点运算,因此无需保存S0-S31这些寄存器,堆栈消耗也会少一些。 //在.S文件中使用UCOS提供的中断管理 startus.s ;/*************************************************************************** ; * .

与其用泪水悔恨昨天,不如用汗水拼搏今天 1706

NXP ChessDE的安装和激活

如果客户申请的是试用版,那么一份为期 30 天的 License 将会发送申请人的账号或邮箱中,客户使用该文件进行安装即可。② 将“VENDOR snpslmd /path/to/snpslmd”中的“/path/to/snpslmd”替换成 snpslmd.exe 实际存放路径(位于 SCL 安装目录下的 win32\bin 文件夹中,默认安装的情况下就是“VENDOR snpslmd C:\Synopsys\SCL\<version>\win32\bin\snpslmd.exe”)。

weixin_47351160的博客 2045

智能驾驶域控(ADCU)方案介绍

本文主要对智能驾驶域控(ADCU)方案相关知识进行总结,以加深理解,及方便后续查漏补缺。

liuxu324的博客 1577

浅谈STM32堆栈与uCOS堆栈,其实是两码事!~

本博文分为3部分,分别为启动代码篇,C堆栈篇,和STM32堆栈和uCOS堆栈区别篇.***********************************************①启动代码篇***********************************************前年毕业时,去了意法半导体工作,所以结识了STM32,先后学习了STM32和uCOS,在后边的学习中突然有了一个疑惑...

qq_23922117的博客 7594

从安装Eclipse 开始 开发第一个 CDS View

一篇超级简单快速的 创建CDS VIEW 入门步骤介绍文章。

IT小职员 4249

<uCOS学习>uCOS工程文件结构分析

最近在学有关实时操作系统,第一步先学习下uCOS 首相还是先分析uCOS工程文件下的文件结构和一些入门所要知道的知识。 keil下uCOS文件结构 首先说明:uCOS2代码结构很不规范,还有很大提升空间,完全移植的工作量比较大 BSP(board support packet)板级支持包 CMSIS、STM32F10x_StdPeriph_Driver和stm32启动、库等有关文件 uCOS-CPU、uCOS-LIB、uCOS-II与uCOS相关的文件库等 这里分析BSP BSP.c文件里主要是对一些外

hwf1877655的博客 463

SimMechanics二连杆仿真避坑指南:Solid模块坐标系设置与Rigid Transform常见错误

本文详细解析了SimMechanics中二连杆平面臂仿真的常见问题,重点探讨Solid模块坐标系设置与Rigid Transform模块的配置陷阱。通过实战案例和MATLAB代码示例,揭示多体系统仿真中的关键错误点,包括坐标系方向定义、参数匹配、端口连接规则等,帮助工程师有效规避仿真风险,提升建模效率。

weixin_29309213的博客 412

《QEMU/KVM源码分析与应用》读书笔记1 —— 第1章 QEMU与KVM概述

《QEMU/KVM源码分析与应用》学习笔记1 —— 第一章 QEMU与KVM概述

phmatthaus的专栏 1984

STM32基于HAL库移植uCOS

在移植过程中步骤比较繁琐,需要仔细一点。利用uC/OS提供的系统特征,可以简化多任务程序设计,满足多个任务的时间要求,大大降低了开发难度,轻松地完成前后台编程方法难以完成的任务。同时利用系统的定时中断,设计一个超级任务来对其他任务进行监控,从而也提高了系统的可靠性。当然我们也看到,程序的可读性和可维护性也提高了。

m0_60483900的博客 828

微信小程序|基于小程序实现定位打卡功能

此文主要在小程序内实现打卡功能,可根据用户位置与公司设定的打卡范围实时判断打卡是否合法,并在后台对打卡记录进行管理。

商务合作 / 项目定制 / 学习交流。个人vx:lovely_wml 1万+

启动ucosii之三PC_VectSet(uCOS,OSCtxSw)

原型来自PC.C PC_VectSet(uCOS,OSCtxSw); //vect向量号,一个内部中断(软中断)向量号 //参数2-中断处理函数.即中断号为0x80的中断处理函数 void PC_VectSet (INT8U vect, void (*isr)(void)) { #if OS_CRITICAL_METHOD == 3                      /* Al

aimarpp的专栏 4287

Google Play上架:谷歌2024年5月份审核政策改动,审核强度逐步提升

Google Play上架:谷歌2024年5月份审核政策改动,审核强度逐步提升

专业解决各种上架过包问题,专业团队专业处理 3188

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

STM32F103移植uCOS-III,keil4调试卡在CPU_TS_TmrRd函数过不去

最近项目需要在STM32F103板子上移植uCOS-III系统,移植过程参考安富莱STM32F407之uCOS-III教程,参考网址 移植uCOS-III系统 虽然教程是关于F407的板子,但大体是相同的。为了省事,我直接在原来的工程中加上uCOS-III源代码。首先在工程目录下创建一个uCOS-III文件夹,然后把安富莱的uCOS-III代码拷贝到新建的uCOS-III文件夹中,对应的目录如下...

xinxin_2011的博客 3230

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

STM32+IAP+uCOS-iii升级跳转至APP程序跑飞问题

最近项目中MCU使用的是STM32F103,APP程序操作系统使用的是uCOS-iii,在进行IAP升级时发现,从Bootloader跳转至APP程序后,APP程序跑飞(boot为裸机,app使用uCOS-iii),不过同样的跳转方式在boot和app都是裸机的情况下是没有问题的。网上百度了许多都是说在跳转前没有处理好中断,有使用的外设没有处理或者栈顶指针的问题。 以下是可以使用的代码: void Jump_To_App(uint32_t app_address) { typedef void (*

狂想家 2485

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

UCOS-II任务与OSCtxSw详解

作者:GWD 时间:2019.12.16 一、 任务切换详解 假设实现TASK1->TASK2的切换 1.代码跟踪 int main(void) OSTaskCreate( ) OS_Sched( ); OS_TASK_SW( ); 注意: OS_TASK_SW( );只是一个宏,代替了OSCtxSw() PendSV_Handler PendSV_Handler_Nosave 2、OSCt...

gongweidi的博客 1771

如何利用kei mdk自带ucos

u/COS-III之移植首先下载STM32编译器软件,这里选择KeiL MDK.其它人也可以选择IAR、或者其它编译器软件:Keil MDK软件下载:官方链接:https://www.keil.com/demo/eval/arm.htm下载完后:安装教程,不在说明。首先打开软件,创建工程如图:创建工程名称创建完成会跳出一个让窗口,这个窗口是让你选择所用的芯片。 选择自己需要的芯片 如果没找到自己的...

weixin_37822428的博客 3035

ucos在s3c2410上运行过程整体剖析-从加电到执行main函数

先说明一下在加电之前的这个软硬件情况,这个三星公司根据ARM920T软核生产的这个s3c2410集成了64M的sdram和64M的nandflash存储器。Vivi和UCOS都存储在这个nandflash中,因为nandflash断电后不会丢失信息。这个VIVI是三星公公司为ARM系列芯片书写的bootloader,用于开发阶段,做系统的引导程序。 VIVI存放在flash 0x00000000

bahutou, 嵌入式系统解决方案 4815
上一篇: Cache&WriteBuffer学习总结
下一篇: ARM寄存器组织
马中马
博客等级 码龄18年 112粉丝 26原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值