uCosII移植到stm32上的**和demo已经很多了,细节上建议大家可以看官方的移植文档(当 然是E文的)。网上流传的各种移植版本基本都是基于官方的移植版本做了小改进。这些改进基本都限制在更适合自己的项目或自己的使用习惯上。当然我也一样, 我的改进是为了搭建一个平台,只要stm32+ucos平台都使用这个版本,无论是我使用或是一起开发者,能更快上手。 uCosII V2.86版本在cortex-m3的移植上面有bug,具体可以自己google一下。我目前使用的是V2.91版本,建立在stm32 V3.40的库基本上。我是强烈要求(或是强制要求)协同开发者使用库函数,除非在速度要求高的情况下或中断里需要直接操作寄存器,也必须使用库的地址定 义,并要求在后面注明对应的库函数。因为程序不是你一个人看的……例如:
[cpp] view plaincopy
- /* Clear the selected DMA interrupt pending bits */
- DMA1->IFCR = DMA1_IT_TC4; //DMA_ClearITPendingBit(DMA1_IT_TC4);
- /* Disable the selected DMAy Channelx */
- DMA1_Channel4->CCR &= (u16)(~DMA_CCR1_EN);//DMA_Cmd(DMA1_Channel4, DISABLE);
好了,进入正题。uCos在stm32上的移植官方的版本是默认不支持中断嵌套的(个人理解),因为其没有调用 NVIC_PriorityGroupConfig这一函数或使用相同的功能语句。stm32在复位的状态下默认进去 NVIC_PriorityGroup_0,即只要子优先级没有主优先级,即先到先处理,同时到达再按优先级处理。 官方在这上面也是留有空间,因为NVIC_PriorityGroupConfig只能调用一次,采用默认状态,开发者可以加入并完善使用中断嵌套。
官方的移植把所有的应用中断入口都指向了 BSP_IntHandler这个函数,并定义了一个函数数组static CPU_FNCT_VOID BSP_IntVectTbl[BSP_INT_SRC_NBR];因此,如果要加入自己的中断函数的话,只需把自己写的中断函数的指针存入这个数组就 OK了,在初始化中断前调用这函数BSP_IntVectSet。官方的中断优先级设置方式,我全删除了,使用库函数来设置将更直接,但这种中断方式保存 下来,这样中断函数更自由,写中断函数时也不用考虑太多东西,只负责自己要做的东西。
[cpp] view plaincopy
- /*
- *********************************************************************************************************
- * INCLUDE FILES
- *********************************************************************************************************
- */
- #define BSP_INTERRUPT_MODULE
- #include
- #include //STM32芯片内部寄存器定议
- #include
- #include
- /*
- *********************************************************************************************************
- * LOCAL DEFINES
- *********************************************************************************************************
- */
- #define BSP_INT_SRC_NBR 60
- /*
- *********************************************************************************************************
- * LOCAL TABLES
- *********************************************************************************************************
- */
- static CPU_FNCT_VOID BSP_IntVectTbl[BSP_INT_SRC_NBR];
- /*
- *********************************************************************************************************
- * LOCAL FUNCTION PROTOTYPES
- *********************************************************************************************************
- */
- static void BSP_IntHandler(u16 int_id);
- static void BSP_IntHandlerDummy(void);
- /*
- *********************************************************************************************************
- * BSP_IntVectSet()
- *
- * Description : Assign ISR handler.
- *
- * Argument(s) : int_id Interrupt for which vector will be set.
- *
- * isr Handler to assign
- *
- * Return(s) : none.
- *
- * Caller(s) : Application.
- *
- * Note(s) : none.
- *********************************************************************************************************
- */
- void BSP_IntVectSet (u16 int_id,
- CPU_FNCT_VOID isr)
- {
- #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
- OS_CPU_SR cpu_sr = 0u;
- #endif
- if(int_id < BSP_INT_SRC_NBR){
- OS_ENTER_CRITICAL();
- BSP_IntVectTbl[int_id] = isr;
- OS_EXIT_CRITICAL();
- }
- }
- /*
- *********************************************************************************************************
- *********************************************************************************************************
- * INTERNAL FUNCTIONS
- *********************************************************************************************************
- *********************************************************************************************************
- */
- /*
- *********************************************************************************************************
- * BSP_IntInit()
- *
- * Description : Initialize interrupts:
- *
- * Argument(s) : none.
- *
- * Return(s) : none.
- *
- * Caller(s) : BSP_Init().
- *
- * Note(s) : none.
- *********************************************************************************************************
- */
- void BSP_IntInit (void)
- {
- u16 int_id;
- OS_CPU_SR cpu_sr;
- OS_ENTER_CRITICAL(); /* Tell uC/OS-II that we are starting an ISR */
- OSIntNeedSW = OSIntSW_Disable; // 需退出中断时进行任务调度切换
- OS_EXIT_CRITICAL();
- for (int_id = 0; int_id < BSP_INT_SRC_NBR; int_id++) {
- BSP_IntVectSet(int_id, BSP_IntHandlerDummy);
- }
- }
- /*
- *********************************************************************************************************
- * BSP_IntHandler####()
- *
- * Description : Handle an interrupt.
- *
- * Argument(s) : none.
- *
- * Return(s) : none.
- *
- * Caller(s) : This is an ISR.
- *
- * Note(s) : none.
- *********************************************************************************************************
- */
- void BSP_IntHandlerWWDG (void) { BSP_IntHandler(WWDG_IRQn); }
- void BSP_IntHandlerPVD (void) { BSP_IntHandler(PVD_IRQn); }
- void BSP_IntHandlerTAMPER (void) { BSP_IntHandler(TAMPER_IRQn); }
- void BSP_IntHandlerRTC (void) { BSP_IntHandler(RTC_IRQn); }
- void BSP_IntHandlerFLASH (void) { BSP_IntHandler(FLASH_IRQn); }
- void BSP_IntHandlerRCC (void) { BSP_IntHandler(RCC_IRQn); }
- void BSP_IntHandlerEXTI0 (void) { BSP_IntHandler(EXTI0_IRQn); }
- void BSP_IntHandlerEXTI1 (void) { BSP_IntHandler(EXTI1_IRQn); }
- void BSP_IntHandlerEXTI2 (void) { BSP_IntHandler(EXTI2_IRQn); }
- void BSP_IntHandlerEXTI3 (void) { BSP_IntHandler(EXTI3_IRQn); }
- void BSP_IntHandlerEXTI4 (void) { BSP_IntHandler(EXTI4_IRQn); }
- void BSP_IntHandlerDMA1_CH1 (void) { BSP_IntHandler(DMA1_Channel1_IRQn); }
- void BSP_IntHandlerDMA1_CH2 (void) { BSP_IntHandler(DMA1_Channel2_IRQn); }
- void BSP_IntHandlerDMA1_CH3 (void) { BSP_IntHandler(DMA1_Channel3_IRQn); }
- void BSP_IntHandlerDMA1_CH4 (void) { BSP_IntHandler(DMA1_Channel4_IRQn); }
- void BSP_IntHandlerDMA1_CH5 (void) { BSP_IntHandler(DMA1_Channel5_IRQn); }
- void BSP_IntHandlerDMA1_CH6 (void) { BSP_IntHandler(DMA1_Channel6_IRQn); }
- void BSP_IntHandlerDMA1_CH7 (void) { BSP_IntHandler(DMA1_Channel7_IRQn); }
- void BSP_IntHandlerADC1_2 (void) { BSP_IntHandler(ADC1_2_IRQn); }
- void BSP_IntHandlerUSB_HP_CAN_TX (void) { BSP_IntHandler(USB_HP_CAN1_TX_IRQn); }
- void BSP_IntHandlerUSB_LP_CAN_RX0(void) { BSP_IntHandler(USB_LP_CAN1_RX0_IRQn); }
- void BSP_IntHandlerCAN_RX1 (void) { BSP_IntHandler(CAN1_RX1_IRQn); }
- void BSP_IntHandlerCAN_SCE (void) { BSP_IntHandler(CAN1_SCE_IRQn); }
- void BSP_IntHandlerEXTI9_5 (void) { BSP_IntHandler(EXTI9_5_IRQn); }
- void BSP_IntHandlerTIM1_BRK (void) { BSP_IntHandler(TIM1_BRK_IRQn); }
- void BSP_IntHandlerTIM1_UP (void) { BSP_IntHandler(TIM1_UP_IRQn); }
- void BSP_IntHandlerTIM1_TRG_COM (void) { BSP_IntHandler(TIM1_TRG_COM_IRQn); }
- void BSP_IntHandlerTIM1_CC (void) { BSP_IntHandler(TIM1_CC_IRQn); }
- void BSP_IntHandlerTIM2 (void) { BSP_IntHandler(TIM2_IRQn); }
- void BSP_IntHandlerTIM3 (void) { BSP_IntHandler(TIM3_IRQn); }
- void BSP_IntHandlerTIM4 (void) { BSP_IntHandler(TIM4_IRQn); }
- void BSP_IntHandlerI2C1_EV (void) { BSP_IntHandler(I2C1_EV_IRQn); }
- void BSP_IntHandlerI2C1_ER (void) { BSP_IntHandler(I2C1_ER_IRQn); }
- void BSP_IntHandlerI2C2_EV (void) { BSP_IntHandler(I2C2_EV_IRQn); }
- void BSP_IntHandlerI2C2_ER (void) { BSP_IntHandler(I2C2_ER_IRQn); }
- void BSP_IntHandlerSPI1 (void) { BSP_IntHandler(SPI1_IRQn); }
- void BSP_IntHandlerSPI2 (void) { BSP_IntHandler(SPI2_IRQn); }
- void BSP_IntHandlerUSART1 (void) { BSP_IntHandler(USART1_IRQn); }
- void BSP_IntHandlerUSART2 (void) { BSP_IntHandler(USART2_IRQn); }
- void BSP_IntHandlerUSART3 (void) { BSP_IntHandler(USART3_IRQn); }
- void BSP_IntHandlerEXTI15_10 (void) { BSP_IntHandler(EXTI15_10_IRQn); }
- void BSP_IntHandlerRTCAlarm (void) { BSP_IntHandler(RTCAlarm_IRQn); }
- void BSP_IntHandlerUSBWakeUp (void) { BSP_IntHandler(USBWakeUp_IRQn); }
- void BSP_IntHandlerTIM8_BRK (void) { BSP_IntHandler(TIM8_BRK_IRQn); }
- void BSP_IntHandlerTIM8_UP (void) { BSP_IntHandler(TIM8_UP_IRQn); }
- void BSP_IntHandlerTIM8_TRG_COM (void) { BSP_IntHandler(TIM8_TRG_COM_IRQn); }
- void BSP_IntHandlerTIM8_CC (void) { BSP_IntHandler(TIM8_CC_IRQn); }
- void BSP_IntHandlerADC3 (void) { BSP_IntHandler(ADC3_IRQn); }
- void BSP_IntHandlerFSMC (void) { BSP_IntHandler(FSMC_IRQn); }
- void BSP_IntHandlerSDIO (void) { BSP_IntHandler(SDIO_IRQn); }
- void BSP_IntHandlerTIM5 (void) { BSP_IntHandler(TIM5_IRQn); }
- void BSP_IntHandlerSPI3 (void) { BSP_IntHandler(SPI3_IRQn); }
- void BSP_IntHandlerUART4 (void) { BSP_IntHandler(UART4_IRQn); }
- void BSP_IntHandlerUART5 (void) { BSP_IntHandler(UART5_IRQn); }
- void BSP_IntHandlerTIM6 (void) { BSP_IntHandler(TIM6_IRQn); }
- void BSP_IntHandlerTIM7 (void) { BSP_IntHandler(TIM7_IRQn); }
- void BSP_IntHandlerDMA2_CH1 (void) { BSP_IntHandler(DMA2_Channel1_IRQn); }
- void BSP_IntHandlerDMA2_CH2 (void) { BSP_IntHandler(DMA2_Channel2_IRQn); }
- void BSP_IntHandlerDMA2_CH3 (void) { BSP_IntHandler(DMA2_Channel3_IRQn); }
- void BSP_IntHandlerDMA2_CH4_5 (void) { BSP_IntHandler(DMA2_Channel4_5_IRQn); }
- /*
- *********************************************************************************************************
- *********************************************************************************************************
- * LOCAL FUNCTIONS
- *********************************************************************************************************
- *********************************************************************************************************
- */
- /*
- *********************************************************************************************************
- * BSP_IntHandler()
- *
- * Description : Central interrupt handler.
- *
- * Argument(s) : int_id Interrupt that will be handled.
- *
- * Return(s) : none.
- *
- * Caller(s) : ISR handlers.
- *
- * Note(s) : none.
- *********************************************************************************************************
- */
- static void BSP_IntHandler (u16 int_id)
- {
- #if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
- OS_CPU_SR cpu_sr = 0u;
- #endif
- OS_ENTER_CRITICAL(); /* 不支持中断嵌套,无需关中断 */
- OSIntNesting++;
- OS_EXIT_CRITICAL();
- if (int_id < BSP_INT_SRC_NBR) {
- BSP_IntVectTbl[int_id]();
- }
- OSIntExit();
- }
- /*
- *********************************************************************************************************
- * BSP_IntHandlerDummy()
- *
- * Description : Dummy interrupt handler.
- *
- * Argument(s) : none.
- *
- * Return(s) : none.
- *
- * Caller(s) : BSP_IntHandler().
- *
- * Note(s) : none.
- *********************************************************************************************************
- */
- static void BSP_IntHandlerDummy (void)
- {
- }
|