共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 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
vscode+cmake搭建雅特力AT32L021开发环境被打赏30分 | |
【换取逻辑分析仪】自制底板并驱动ArduinoNanoRP2040ConnectLCD扩展板被打赏47分 | |
【分享评测,赢取加热台】RISC-V GCC 内嵌汇编使用被打赏38分 | |
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 |