中级会员
 
- 积分
- 399
- 金钱
- 399
- 注册时间
- 2014-11-7
- 在线时间
- 44 小时
|
5金钱
针对UCOSIII的移植,自己完成了大半年了, 在自己又一遍的时候,觉得自己可以独立试着移植的时候,我觉得移植改动的地方不多呀,一个得为系统提供时间基准, SysTick便用上了,
在初始化时看到原子哥 用的 N多寄存器,看完我参考的资料里面只用了一句? SysTick_Config(SystemCoreClock/OS_CFG_TICK_RATE_HZ); //OS_CFG_TICK_RATE_HZ这个为宏定义、
SystemCoreClock为系统时钟 函数在core_cm3.h(曾看到过帖子说这个问价删了没用,大概用处在此吧),代码如下
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{
if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */
SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register */
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Cortex-M0 System Interrupts */
SysTick->VAL = 0; /* Load the SysTick Counter Value */
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */
return (0); /* Function successful */
}
那么问题就来了? 这个滴答中断的优先级在哪儿呢? 顺藤摸瓜 来看看
static __INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
{
if(IRQn < 0) {
SCB->SHP[((uint32_t)(IRQn) & 0xF)-4] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for Cortex-M3 System Interrupts */
else {
NVIC->IP[(uint32_t)(IRQn)] = ((priority << (8 - __NVIC_PRIO_BITS)) & 0xff); } /* set Priority for device specific Interrupts */
}
自己算了下 直接把滴答的中断优先级设置为 1110 0000 也就是0XE0 ( __NVIC_PRIO_BITS 的宏定义为 4 )
怎么回事呀? 把滴答的优先级设置的这么低? 立马想到原子哥 的 中断寄存器设置为 0XFF见附图
那么 问题就来了,这么低的优先级 如果别的中断抢占了的话,岂不是整个延时 什么的都不准了么? 新手 还望高手别见笑!
|
|