历史上的今天
今天是:2025年01月07日(星期二)
2020年01月07日 | OS_CPU_A.ASM cortex-M3 解析
2020-01-07 来源:eefocus
琢磨ucos内核进行中++>>>>>>>
先上cortex-M3 与本部分相关的汇编指令
相关的汇编指令

至于相关伪指令,参见:-----ARM汇编伪指令----
NVIC---Nested Vectored Interrupt controller--嵌套向量中断控制器
这里给出NVIC寄存器映射:
NVIC 空间还用来实现系统控制寄存器。NVIC 空间分成以下部分:
0xE000E000 - 0xE000E00F. 中断类型寄存器
0xE000E010 - 0xE000E0FF. 系统定时器
0xE000E100 - 0xE000ECFF. NVIC
0xE000ED00 -0xE000ED8F. 系统控制模块,包括:CPUID;系统控制、配置和状态;故障报告。
0xE000EF00 - 0xE000EF0F. 软件触发异常寄存器
0xE000EFD0 -0xE000EFFF. ID空间
详情查看:《cortex-M3技术参考手册》
另,关于Cortex-M3存储器结构和STM32存储器结构,参见 stm32存储器结构
这里关注如下寄存器:

留意标注的就好。
中断控制状态寄存器 :
中断控制状态寄存器用于:
设置一个挂起(pending)NMI
设置或清除一个挂起 SVC
设置或清除一个挂起 SysTick
查找挂起异常
查找最高优先级挂起异常的向量号
查找激活异常的向量号
寄存器地址、访问类型和复位状态:见上表
中断控制状态寄存器的位分配:

说明如下:



系统处理器优先级寄存器 :
通过 3 个处理器优先级寄存器为系统处理器排列优先级:
存储器管理
总线故障
使用故障
调试监控
SVC
SysTick
PendSV
系统处理器是一种特殊的异常处理器,它可以将自己的优先级设置成任意级别。大多数系统处理器都可以打开屏蔽(使能)或关闭屏蔽(禁能) 。禁能时,故障总是被当作硬故障。
寄存器地址、访问类型和复位状态:--见上边
系统处理器优先级寄存器的位分配:

下表描述了系统处理器优先级寄存器的各个位。

这里我们关注 PRI_11、PRI15、PRI_14==>SVCall异常、SysCall异常、PendSV异常。。。
以上只为更好的读懂、理解 OS_CPU_A.ASM ,,,
OS_CPU_A.ASM解析:
环境:
STM32 cortex-M3内核的片子 + ucos + IAR
@自己:coretex A8、A9都是armv7a 架构;coretex M3、M4是armv7m架构;前者是内核,后者是指令集的架构。
变量、函数声明 及 相关宏定义:有点像.h文件干的事。
;********************************************************************************************************
EXTERN OSRunning ; External references 全局变量声明,非本地定义
EXTERN OSPrioCur
EXTERN OSPrioHighRdy
EXTERN OSTCBCur
EXTERN OSTCBHighRdy
EXTERN OSIntNesting
EXTERN OSIntExit
EXTERN OSTaskSwHook
EXTERN OSRdyGrp
EXTERN OSRdyTbl
EXTERN OSPrioHighRdy
PUBLIC OS_CPU_SR_Save ; Functions declared in this file 公共函数声明
PUBLIC OS_CPU_SR_Restore
PUBLIC OSStartHighRdy
PUBLIC OSCtxSw
PUBLIC OSIntCtxSw
PUBLIC OS_CPU_PendSVHandler
;********************************************************************************************************
; EQUATES;宏定义
;********************************************************************************************************
NVIC_INT_CTRL EQU 0xE000ED04 ; Interrupt control state register.
NVIC_SYSPRI14 EQU 0xE000ED22 ; System priority register (priority 14).
NVIC_PENDSV_PRI EQU 0xFF ; PendSV priority value (lowest).
NVIC_PENDSVSET EQU 0x10000000 ; Value to trigger PendSV exception.
然后是--RSEG CODE:CODE:NOROOT(2)
RSEG CODE:CODE:NOROOT(2)
+
已经注释的OS_SchedNew 实现..
.................
原谅我看不太懂,,
提供线索如下,


处理关键代码段时开关中断:
CRITICAL SECTION METHOD 3 FUNCTIONS:关键代码段方法3函数
Description:通过保存中断的状态来禁用/启用中断。一般来说我们将中断禁用标志的状态存储在本地变量“cpu_sr”中然后禁用中断。我们能够恢复中断禁用状态通过复制回“cpu_sr”到CPU状态寄存器中。
;********************************************************************************************************
; CRITICAL SECTION METHOD 3 FUNCTIONS
;
; Description: Disable/Enable interrupts by preserving the state of interrupts. Generally speaking you
; would store the state of the interrupt disable flag in the local variable 'cpu_sr' and then
; disable interrupts. 'cpu_sr' is allocated in all of uC/OS-II's functions that need to
; disable interrupts. You would restore the interrupt disable state by copying back 'cpu_sr'
; into the CPU's status register.
;
; Prototypes : OS_CPU_SR OS_CPU_SR_Save(void);
; void OS_CPU_SR_Restore(OS_CPU_SR cpu_sr);
;
;
; Note(s) : 1) These functions are used in general like this:
;
; void Task (void *p_arg)
; {
; #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
; OS_CPU_SR cpu_sr;
; #endif
;
; :
; :
; OS_ENTER_CRITICAL(); /* cpu_sr = OS_CPU_SaveSR(); */
; :
; :
; OS_EXIT_CRITICAL(); /* OS_CPU_RestoreSR(cpu_sr); */
; :
; :
; }
;********************************************************************************************************
OS_CPU_SR_Save
MRS R0, PRIMASK ; 读回PRIMASK寄存器内容
CPSID I
BX LR
OS_CPU_SR_Restore
MSR PRIMASK, R0
BX LR
PRIMASK寄存器: 除能所有的中断——当然了,不可屏蔽中断(NMI)不甩它。
OSStartHighRdy:
当OS初始化完毕后,执行OSStart,OSStart最后调用OSStartHighRdy函数,注意在此之前的线程模式和异常模式的堆栈都是MSP,在此之后线程模式的堆栈是PSP,异常模式的堆栈仍是MSP。
;********************************************************************************************************
; START MULTITASKING 开始任务
; void OSStartHighRdy(void)
;
; Note(s) : 1) This function triggers a PendSV exception (essentially, causes a context switch) to cause
; the first task to start.函数触发PendSV异常(从本质上讲,是导致上下文切换)导致第一个任务开始
;
; 2) OSStartHighRdy() MUST: 关键流程
; a) Setup PendSV exception priority to lowest;
; 设置PendSV异常优先级到最低
; b) Set initial PSP to 0, to tell context switcher this is first run;
; 设置初始进程堆栈到0位置,目的是告诉上下文/任务切换器这个函数第一个执行
; c) Set OSRunning to TRUE;
; 设置OSRunning标志为TRUE
; d) Trigger PendSV exception;
; 切换PendSV异常
; e) Enable interrupts (tasks will run with interrupts enabled).
; 使能中断(任务将通过启用中断运行)
;********************************************************************************************************
OSStartHighRdy
LDR R0, =NVIC_SYSPRI14 ; Set the PendSV exception priority
LDR R1, =NVIC_PENDSV_PRI
STRB R1, [R0];R1寄存器中的内容存放/写入到以R0内容作为地址的内存中
MOVS R0, #0 ; Set the PSP to 0 for initial context switch call
MSR PSP, R0
LDR R0, =OSRunning ; OSRunning = TRUE
MOVS R1, #1
STRB R1, [R0]
LDR R0, =NVIC_INT_CTRL ; Trigger the PendSV exception (causes context switch)
LDR R1, =NVIC_PENDSVSET
STR R1, [R0]
CPSIE I ; Enable interrupts at processor level
OSStartHang
B OSStartHang ; Should never get here正常情况下,不应运行到这
任务级的上下文切换:
;********************************************************************************************************
; PERFORM A CONTEXT SWITCH (From task level) 从任务级执行一个上下文切换
; void OSCtxSw(void)
;
; Note(s) : 1) OSCtxSw() is called when OS wants to perform a task context switch. This function
; triggers the PendSV exception which is where the real work is done.
;********************************************************************************************************
上一篇:cortex-M3 异常和中断
史海拾趣
|
谁有fs2410的驱动,能给我发一份吗?我就快毕不了业,写个按键驱动,中断怎么都没有反应。我的邮箱lihongdongnan@yahoo.cn… 查看全部问答> |
|
1:2440在ADC等待模式的中断,只能每按一次产生一次中断,如果我想按下去一直放手,最后也只能产生一次中断....做到手写的驱动是需要按下时一直继续进行采样的,可在2440不知道怎样做 2:自动X,y转换模式应当怎样使用?我试过后好像不能进入中断服务程序 ...… 查看全部问答> |
|
我想在wince环境下 生成一个xml文件 内容有 George John Reminder Don\'t forget the meeting! 在网上找了好久 都 ...… 查看全部问答> |
|
有谁知道一般的科学计算器用的是什么型号的CPU?51系列还是其它的呢?谢谢! 自己想搭个硬件平台做科学计算器,把自己的计算器拆开只看到一个裸片,一块大黑痣里面是啥都看不到郁闷!有人知道一般的科学计算器都用什么cpu来实现么,不知c51能不能符合要求,因为c51对浮点的支持比较差,只支持到单精度,这对对精度要求较高的 ...… 查看全部问答> |
|
wince5.0 可以安装在window2003操作系统上吗? 百分请教 GOOGLE了。BAIDU了。都没找到类似的答案 请教了。。。。。 安装的时候,提示是需要2000 的SP1,或者是XP的SP4。。。 是不是意味着2003无法安装WINCE5.0??? … 查看全部问答> |
|
哪位有STM8L151G4 和STM8L152M8的最小系统图 抱歉 我不是故意伸手 主要是时间紧 而且刚接手 时间来不及 哪位有的高手请麻烦帮忙一下 我邮箱是396095630@qq.com万分感谢… 查看全部问答> |
|
数码管的位选能不接三极管直接接IO口吗?为什么? 点阵可不可以不接芯片,直接用三极管驱动?为什么? 点阵可不可以直接接IO口?为什么? 请各位大大教教小白。 那还有一个问题就是接电阻的作用是限流,但是限流不就让电流更小了吗?那不就不会 ...… 查看全部问答> |
|
一、Value Line入门这一部分将介绍MSP430 Value Line系列微控制器,同时需要准备下载并安装相关的软件,并且对MSP-EXP430G2-LaunchPad开发板进行相关设置。 流程:Value Line介绍TI系列微控制器总览MSP430系列微控制器路线图Value Line系列介 ...… 查看全部问答> |
|
本帖最后由 jameswangsynnex 于 2015-3-3 20:02 编辑 6月12日凌晨消息,苹果正式发布新一代移动操作系统iOS 6。新系统中集成了全新的自有3D地图,并且Siri增加中文语音输入。支持设备包括:iPhone 3GS、iPhone 4、iPhone 4S,iPad二代及三代,以及 ...… 查看全部问答> |




