共2条
1/1 1 跳转至页
OS,IRQ,OS,IRQ 什么是受OS管理的IRQ,什么是不受OS管理的IRQ,如何使用和区分?

问
我一直搞不清,什么是什么是受OS管理的IRQ,什么是不受OS管理的IRQ。
如何知道他是受OS管理的IRQ。在编程中如何编写受OS管理的IRQ。
编写受在编程中如何编写受OS管理的IRQ要注意什么呢?
一直愚钝。望指点。 答 1: 应该在于堆栈空间不同 答 2: 不受OS管理的中断,在中断中是不能使用OS API的 答 3: 那位能给一个受OS管理的IRQ例子让研究研究。 答 4: 一般来说,还是全让OS管理吧,中断响应时间慢不了多少 答 5: TO pubstar: 就是不知道如何让OS管理呀?就是不知道如何让OS管理. 答 6: 我想是不是非OS的用__irq写服务程序,OS的用IRQ_Exception 答 7: 文件1;
;********************************************************************************************************
; uC/OS-II
; The Real-Time Kernel
;
; (c) Copyright 1992-2003, Jean J. Labrosse, Weston, FL
; All Rights Reserved
;
;********************************************************************************************************
;
AREA UCOS_ARM_ASM_INT, CODE, READONLY
;*********************************************************************************************************
; IRQ HANDLER
;
; This handles all the IRQs
; Note: FIQ Handler should be written similar to this
; 中断返回时需要任务切换中断按如下的格式在注册(引用上面的宏定义) $IRQ_AsmEntery HANDLER $IRQ_CEntry
;
;*********************************************************************************************************
IMPORT OSIntEnter
IMPORT OSIntExit
IMPORT OSIntCtxSwFlag
IMPORT _IntCtxSw
MACRO
$IRQ_AsmEntery HANDLER $IRQ_CEntry
EXPORT $IRQ_AsmEntery ; 输出的标号
IMPORT $IRQ_CEntry ; 引用的外部标号
$IRQ_AsmEntery ;本移置不支持中断嵌套,故中断中,无需关中断
stmfd sp!,{r0-r3,r12,lr}
bl OSIntEnter
bl $IRQ_CEntry
bl OSIntExit
ldr r0,=OSIntCtxSwFlag
ldr r1,[r0]
cmp r1,#1
beq _IntCtxSw
ldmfd sp!,{r0-r3,r12,lr}
subs pc,lr,#4
MEND
;中断注册
;定时器0中断
IRQASMTimer0 HANDLER IRQCTimer0 ;分配到VICVectAddr15
;定时器1中断
IRQASMTimer1 HANDLER IRQCTimer1 ;分配到VICVectAddr8
;串口0中断
IRQASMUart0 HANDLER IRQCUart0 ;分配到VICVectAddr13
;串口1中断
IRQASMUart1 HANDLER IRQCUart1 ;分配到VICVectAddr10
;外部中断0中断
;IRQASMEx0 HANDLER IRQCEx0
;外部中断1中断
;IRQASMEx1 HANDLER IRQCEx1
;外部中断2中断
IRQASMEx2 HANDLER IRQCEx2 ;分配到分配到VICVectAddr2,打印电机复位信号
;外部中断3中断
IRQASMEx3 HANDLER IRQCEx3 ;分配到分配到VICVectAddr3,打印电机同步信号
;SPI中断
;IRQASMSpi HANDLER IRQCSpi
;I2C中断
IRQASMI2c HANDLER IRQCI2c ;分配到VICVectAddr6
;RTC中断
IRQASMRTC HANDLER IRQCRTC ;分配到VICVectAddr14,每秒中断一次或报警
END
答 8: 定时器0就是接受内核管理了void TargetInit(void){
TIMER0_PR=0; //设置定时器分频为0,即不分频
TIMER0_MCR|=0x03; //匹配通道0匹配中断并复位T0TC
TIMER0_MR0=(double)Fpclk/OS_TICKS_PER_SEC; //设置比较值,每秒产生OS_TICKS_PER_SEC个时钟
TIMER0_TCR=0x03; //定时器与预分频计数器使能并同步
TIMER0_TCR=0x01; //定时器使能
VICVectCntl15=0x24; //定时器0中断通道采用最低优先级
VICVectAddr15=(U32)IRQASMTimer0; //设置中断服务程序地址向量
VICIntEnable=0x00000010; //使能定时器0中断
WDTC=(double)Fpclk/4/2; //定时器初值,每秒喂两次即可,即500ms内喂一次即可
WDMOD=0x03; //使能看门定时器中断和复位
WDFEED=0xaa; //喂狗一次,由于此时中断未打开,所以不用关中断
//第一个任何执行时,才打开中断
WDFEED=0x55; //其它地方只在空闲任何喂狗,如果500ms不执行一次空闲,即复位
}
如何知道他是受OS管理的IRQ。在编程中如何编写受OS管理的IRQ。
编写受在编程中如何编写受OS管理的IRQ要注意什么呢?
一直愚钝。望指点。 答 1: 应该在于堆栈空间不同 答 2: 不受OS管理的中断,在中断中是不能使用OS API的 答 3: 那位能给一个受OS管理的IRQ例子让研究研究。 答 4: 一般来说,还是全让OS管理吧,中断响应时间慢不了多少 答 5: TO pubstar: 就是不知道如何让OS管理呀?就是不知道如何让OS管理. 答 6: 我想是不是非OS的用__irq写服务程序,OS的用IRQ_Exception 答 7: 文件1;
;********************************************************************************************************
; uC/OS-II
; The Real-Time Kernel
;
; (c) Copyright 1992-2003, Jean J. Labrosse, Weston, FL
; All Rights Reserved
;
;********************************************************************************************************
;
AREA UCOS_ARM_ASM_INT, CODE, READONLY
;*********************************************************************************************************
; IRQ HANDLER
;
; This handles all the IRQs
; Note: FIQ Handler should be written similar to this
; 中断返回时需要任务切换中断按如下的格式在注册(引用上面的宏定义) $IRQ_AsmEntery HANDLER $IRQ_CEntry
;
;*********************************************************************************************************
IMPORT OSIntEnter
IMPORT OSIntExit
IMPORT OSIntCtxSwFlag
IMPORT _IntCtxSw
MACRO
$IRQ_AsmEntery HANDLER $IRQ_CEntry
EXPORT $IRQ_AsmEntery ; 输出的标号
IMPORT $IRQ_CEntry ; 引用的外部标号
$IRQ_AsmEntery ;本移置不支持中断嵌套,故中断中,无需关中断
stmfd sp!,{r0-r3,r12,lr}
bl OSIntEnter
bl $IRQ_CEntry
bl OSIntExit
ldr r0,=OSIntCtxSwFlag
ldr r1,[r0]
cmp r1,#1
beq _IntCtxSw
ldmfd sp!,{r0-r3,r12,lr}
subs pc,lr,#4
MEND
;中断注册
;定时器0中断
IRQASMTimer0 HANDLER IRQCTimer0 ;分配到VICVectAddr15
;定时器1中断
IRQASMTimer1 HANDLER IRQCTimer1 ;分配到VICVectAddr8
;串口0中断
IRQASMUart0 HANDLER IRQCUart0 ;分配到VICVectAddr13
;串口1中断
IRQASMUart1 HANDLER IRQCUart1 ;分配到VICVectAddr10
;外部中断0中断
;IRQASMEx0 HANDLER IRQCEx0
;外部中断1中断
;IRQASMEx1 HANDLER IRQCEx1
;外部中断2中断
IRQASMEx2 HANDLER IRQCEx2 ;分配到分配到VICVectAddr2,打印电机复位信号
;外部中断3中断
IRQASMEx3 HANDLER IRQCEx3 ;分配到分配到VICVectAddr3,打印电机同步信号
;SPI中断
;IRQASMSpi HANDLER IRQCSpi
;I2C中断
IRQASMI2c HANDLER IRQCI2c ;分配到VICVectAddr6
;RTC中断
IRQASMRTC HANDLER IRQCRTC ;分配到VICVectAddr14,每秒中断一次或报警
END
答 8: 定时器0就是接受内核管理了void TargetInit(void){
TIMER0_PR=0; //设置定时器分频为0,即不分频
TIMER0_MCR|=0x03; //匹配通道0匹配中断并复位T0TC
TIMER0_MR0=(double)Fpclk/OS_TICKS_PER_SEC; //设置比较值,每秒产生OS_TICKS_PER_SEC个时钟
TIMER0_TCR=0x03; //定时器与预分频计数器使能并同步
TIMER0_TCR=0x01; //定时器使能
VICVectCntl15=0x24; //定时器0中断通道采用最低优先级
VICVectAddr15=(U32)IRQASMTimer0; //设置中断服务程序地址向量
VICIntEnable=0x00000010; //使能定时器0中断
WDTC=(double)Fpclk/4/2; //定时器初值,每秒喂两次即可,即500ms内喂一次即可
WDMOD=0x03; //使能看门定时器中断和复位
WDFEED=0xaa; //喂狗一次,由于此时中断未打开,所以不用关中断
//第一个任何执行时,才打开中断
WDFEED=0x55; //其它地方只在空闲任何喂狗,如果500ms不执行一次空闲,即复位
}
共2条
1/1 1 跳转至页
回复
打赏帖 | |
---|---|
rtthread硬件加密--2crc加密分析被打赏10分 | |
【分享开发笔记,赚取电动螺丝刀】mcxa156使用低功耗定时器适配硬件RTC框架被打赏26分 | |
【STM32F769】AI之与本地deepseek对接被打赏50分 | |
Buck电路工作在CCM模式下电感电流的计算公式是什么?被打赏5分 | |
buck电路工作原理被打赏5分 | |
基于MSPM0L1306的MODBUS-RTU协议通讯实验被打赏100分 | |
我想要一部加热台+多合一调试工具被打赏18分 | |
每周了解几个硬件知识+485硬件知识分享被打赏10分 | |
【换取手持示波器】TouchGFX应用移植自定义屏幕被打赏34分 | |
【换取手持数字示波器】树莓派PICO调试器官方固件本地化部署实践被打赏24分 |