在UCOSIII下:
我也有同样问题,但是我认为这里有错,应该不是这里设置systick中断的优先级
NVIC_INT_CTRL EQU 0xE000ED04 ; Interrupt control state register.
NVIC_SYSPRI14 EQU 0xE000ED22 ; System priority register (priority 14).
NVIC_PENDSV_PRI EQU 0xFFFF ; PendSV和滴答定时器优先级设置为最低
NVIC_PENDSVSET EQU 0x10000000 ; Value to trigger PendSV exception.
OSStartHighRdy
LDR R0, =NVIC_SYSPRI14 ; Set the PendSV exception priority
LDR R1, =NVIC_PENDSV_PRI
STRB R1, [R0]
MOVS R0, #0 ; Set the PSP to 0 for initial context switch call
MSR PSP, R0
LDR R0, =OS_CPU_ExceptStkBase ; Initialize the MSP to the OS_CPU_ExceptStkBase
LDR R1, [R0]
MSR MSP, R1
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
/////////////////////////////////////////////////////////////////////////////////////
0xE000ED22 是PendSV的异常优先级寄存器
0xE000ED23 是systick的异常优先级寄存器
表8.3B 系统异常优先级寄存器阵列 0xE000_ED18 - 0xE000_ED23
地址 名称 类型 复位值 描述0xE000_ED18 PRI_4 存储器管理 fault 的优先级0xE000_ED19 PRI_5 总线 fault 的优先级0xE000_ED1A PRI_6 用法 fault 的优先级0xE000_ED1B ‐ ‐ ‐ ‐0xE000_ED1C ‐ ‐ ‐ ‐0xE000_ED1D ‐ ‐ ‐ ‐0xE000_ED1E ‐ ‐ ‐ ‐0xE000_ED1F PRI_11 SVC 优先级0xE000_ED20 PRI_12 调试监视器的优先级0xE000_ED21 ‐ ‐ ‐ ‐0xE000_ED22 PRI_14 PendSV 的优先级0xE000_ED23 PRI_15 SysTick 的优先级
所以这里只是设置了PendSv的并没有设置Systick的(个人认为)。
感觉是使用的是默认的中断优先级,在程序中没有发现是在哪还有设定,如有麻烦请解答一下。
在UCOSIII下:
我也有同样问题,但是我认为这里有错,应该不是这里设置systick中断的优先级
NVIC_INT_CTRL EQU 0xE000ED04 ; Interrupt control state register.
NVIC_SYSPRI14 EQU 0xE000ED22 ; System priority register (priority 14).
NVIC_PENDSV_PRI EQU 0xFFFF ; PendSV和滴答定时器优先级设置为最低
NVIC_PENDSVSET EQU 0x10000000 ; Value to trigger PendSV exception.
OSStartHighRdy
LDR R0, =NVIC_SYSPRI14 ; Set the PendSV exception priority
LDR R1, =NVIC_PENDSV_PRI
STRB R1, [R0]
MOVS R0, #0 ; Set the PSP to 0 for initial context switch call
MSR PSP, R0
LDR R0, =OS_CPU_ExceptStkBase ; Initialize the MSP to the OS_CPU_ExceptStkBase
LDR R1, [R0]
MSR MSP, R1
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
/////////////////////////////////////////////////////////////////////////////////////
0xE000ED22 是PendSV的异常优先级寄存器
0xE000ED23 是systick的异常优先级寄存器
表8.3B 系统异常优先级寄存器阵列 0xE000_ED18 - 0xE000_ED23
地址 名称 类型 复位值 描述0xE000_ED18 PRI_4 存储器管理 fault 的优先级0xE000_ED19 PRI_5 总线 fault 的优先级0xE000_ED1A PRI_6 用法 fault 的优先级0xE000_ED1B ‐ ‐ ‐ ‐0xE000_ED1C ‐ ‐ ‐ ‐0xE000_ED1D ‐ ‐ ‐ ‐0xE000_ED1E ‐ ‐ ‐ ‐0xE000_ED1F PRI_11 SVC 优先级0xE000_ED20 PRI_12 调试监视器的优先级0xE000_ED21 ‐ ‐ ‐ ‐0xE000_ED22 PRI_14 PendSV 的优先级0xE000_ED23 PRI_15 SysTick 的优先级
所以这里只是设置了PendSv的并没有设置Systick的(个人认为)。
感觉是使用的是默认的中断优先级,在程序中没有发现是在哪还有设定,如有麻烦请解答一下。
举报