打印

[请教]关于在ucos中断函数的编写的疑问

[复制链接]
8775|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yxdengos|  楼主 | 2009-7-28 14:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
zjf0000| | 2009-7-28 15:45 | 只看该作者

rx

中断中加入
OS_ENTER_CRITICAL();                                                
OSIntNesting++;
OS_EXIT_CRITICAL();
中断离开的时候加  
OSIntExit();

  

使用特权

评论回复
板凳
machunshui| | 2009-7-28 16:16 | 只看该作者

ARM上的UOCOS的中断

ARM上的UOCOS中断汇编部分移植的时候,被包裹起来,用户使用中断函数的时候不需要写汇编.

实际上中断发生的时候,入口部分是移植的汇编,这部分汇编代码根据相关寄存器,通过函数指针执行用户的中断处理程序

使用特权

评论回复
地板
zyboy| | 2009-7-28 16:30 | 只看该作者

单片机和ARM中断机制不同

个人感觉可能是单片机和ARM中断机制不同,ARM一般有向量中断控制器,对各种中断前期有个管理过程,而单片机没有。所以对堆栈的保存单片机不同的中断都要执行,而ARM可以在跳转到各种具体中断之前把堆栈保存等操作写在前面,当然本人是胡乱想的!

别玩ucos,玩这个被鄙视,我们这里谁要说会这个,大家都不说话了,然后一起用鄙视的眼神看着他。。。。。

使用特权

评论回复
5
machunshui| | 2009-7-28 16:36 | 只看该作者

以lpc2000 ARM7在IAR上的移植为例子

1.

void  BSP_Init (void)
{
    MEMMAP                            = 2;                      /* Remap 64 bytes of int. RAM to 0x00  */
    
    BSP_IRQ_VECTOR_ADDR               = 0xE59FF018;             /* LDR PC,[PC,#0x18] instruction       */
    BSP_IRQ_ISR_ADDR                  = (INT32U)OS_CPU_IRQ_ISR; /* IRQ exception vector address        */

....
}

使用RAM中断向量,
在IRQ中断向量位置写入一条指令;LDR PC,[PC,#0x18]
跳转到OS_CPU_IRQ_ISR汇编代码段

使用特权

评论回复
6
machunshui| | 2009-7-28 16:55 | 只看该作者

至于STM32的UCOS没研究过,应该少不了汇编段

至于STM32的UCOS没研究过,应该少不了汇编段.

使用特权

评论回复
7
冷漠| | 2009-7-28 17:18 | 只看该作者

请教4楼zyboy

能否告知如今玩什么不受鄙夷受尊重?

你们那里那么多受人尊重的人才,有没有写出过一个简单的自主知识产权的RTOS,例如51系列上能用的。——我们单位将以技术转让形式重金购买源代码。

也免得我们在这一年到头研究开发51RTOS,而收效甚微。

使用特权

评论回复
8
lpf336| | 2009-7-28 17:29 | 只看该作者

呵呵

使用特权

评论回复
9
machunshui| | 2009-7-28 18:01 | 只看该作者

看看STM32下面UCOS移植,中断是如何做的

刚研究一下STM32下面的UCOS的一个例子,

虽然STM32和ARM7不同是多向量入口中断,

但是移植的时候无非还是使用了函数指针表.

1.

void  BSP_IntVectSet (CPU_DATA       int_id,
                      CPU_FNCT_VOID  isr)
{
#if (CPU_CFG_CRITICAL_METHOD == CPU_CRITICAL_METHOD_STATUS_LOCAL)
    CPU_SR   cpu_sr;
#endif


    if (int_id < BSP_INT_SRC_NBR) {
        CPU_CRITICAL_ENTER();
        BSP_IntVectTbl[int_id] = isr;
        CPU_CRITICAL_EXIT();
    }
}

用户中断设置函数,把用户中断处理函数地址写入以中断向量id为下标的函数指针数组成员中.

使用特权

评论回复
10
machunshui| | 2009-7-28 18:05 | 只看该作者

中断向量入口函数当中调用BSP_IntHandler

void  BSP_IntHandlerWWDG          (void)  { BSP_IntHandler(BSP_INT_ID_WWDG);            }
void  BSP_IntHandlerPVD           (void)  { BSP_IntHandler(BSP_INT_ID_PVD);             }
void  BSP_IntHandlerTAMPER        (void)  { BSP_IntHandler(BSP_INT_ID_TAMPER);          }
void  BSP_IntHandlerRTC           (void)  { BSP_IntHandler(BSP_INT_ID_RTC);             }
void  BSP_IntHandlerFLASH         (void)  { BSP_IntHandler(BSP_INT_ID_FLASH);           }
void  BSP_IntHandlerRCC           (void)  { BSP_IntHandler(BSP_INT_ID_RCC);             }
void  BSP_IntHandlerEXTI0         (void)  { BSP_IntHandler(BSP_INT_ID_EXTI0);           }
void  BSP_IntHandlerEXTI1         (void)  { BSP_IntHandler(BSP_INT_ID_EXTI1);           }
void  BSP_IntHandlerEXTI2         (void)  { BSP_IntHandler(BSP_INT_ID_EXTI2);           }
void  BSP_IntHandlerEXTI3         (void)  { BSP_IntHandler(BSP_INT_ID_EXTI3);           }
void  BSP_IntHandlerEXTI4         (void)  { BSP_IntHandler(BSP_INT_ID_EXTI4);           }
void  BSP_IntHandlerDMA1_CH1      (void)  { BSP_IntHandler(BSP_INT_ID_DMA1_CH1);        }
void  BSP_IntHandlerDMA1_CH2      (void)  { BSP_IntHandler(BSP_INT_ID_DMA1_CH2);        }
void  BSP_IntHandlerDMA1_CH3      (void)  { BSP_IntHandler(BSP_INT_ID_DMA1_CH3);        }
void  BSP_IntHandlerDMA1_CH4      (void)  { BSP_IntHandler(BSP_INT_ID_DMA1_CH4);        }
void  BSP_IntHandlerDMA1_CH5      (void)  { BSP_IntHandler(BSP_INT_ID_DMA1_CH5);        }
void  BSP_IntHandlerDMA1_CH6      (void)  { BSP_IntHandler(BSP_INT_ID_DMA1_CH6);        }
void  BSP_IntHandlerDMA1_CH7      (void)  { BSP_IntHandler(BSP_INT_ID_DMA1_CH7);        }
void  BSP_IntHandlerADC1_2        (void)  { BSP_IntHandler(BSP_INT_ID_ADC1_2);          }
void  BSP_IntHandlerUSB_HP_CAN_TX (void)  { BSP_IntHandler(BSP_INT_ID_USB_HP_CAN_TX);   }
void  BSP_IntHandlerUSB_LP_CAN_RX0(void)  { BSP_IntHandler(BSP_INT_ID_USB_LP_CAN_RX0);  }
void  BSP_IntHandlerCAN_RX1       (void)  { BSP_IntHandler(BSP_INT_ID_CAN_RX1);         }
void  BSP_IntHandlerCAN_SCE       (void)  { BSP_IntHandler(BSP_INT_ID_CAN_SCE);         }
void  BSP_IntHandlerEXTI9_5       (void)  { BSP_IntHandler(BSP_INT_ID_EXTI9_5);         }
void  BSP_IntHandlerTIM1_BRK      (void)  { BSP_IntHandler(BSP_INT_ID_TIM1_BRK);        }
void  BSP_IntHandlerTIM1_UP       (void)  { BSP_IntHandler(BSP_INT_ID_TIM1_UP);         }
void  BSP_IntHandlerTIM1_TRG_COM  (void)  { BSP_IntHandler(BSP_INT_ID_TIM1_TRG_COM);    }
void  BSP_IntHandlerTIM1_CC       (void)  { BSP_IntHandler(BSP_INT_ID_TIM1_CC);         }
void  BSP_IntHandlerTIM2          (void)  { BSP_IntHandler(BSP_INT_ID_TIM2);            }
void  BSP_IntHandlerTIM3          (void)  { BSP_IntHandler(BSP_INT_ID_TIM3);            }
void  BSP_IntHandlerTIM4          (void)  { BSP_IntHandler(BSP_INT_ID_TIM4);            }
void  BSP_IntHandlerI2C1_EV       (void)  { BSP_IntHandler(BSP_INT_ID_I2C1_EV);         }
void  BSP_IntHandlerI2C1_ER       (void)  { BSP_IntHandler(BSP_INT_ID_I2C1_ER);         }
void  BSP_IntHandlerI2C2_EV       (void)  { BSP_IntHandler(BSP_INT_ID_I2C2_EV);         }
void  BSP_IntHandlerI2C2_ER       (void)  { BSP_IntHandler(BSP_INT_ID_I2C2_ER);         }
void  BSP_IntHandlerSPI1          (void)  { BSP_IntHandler(BSP_INT_ID_SPI1);            }
void  BSP_IntHandlerSPI2          (void)  { BSP_IntHandler(BSP_INT_ID_SPI2);            }
void  BSP_IntHandlerUSART1        (void)  { BSP_IntHandler(BSP_INT_ID_USART1);          }
void  BSP_IntHandlerUSART2        (void)  { BSP_IntHandler(BSP_INT_ID_USART2);          }
void  BSP_IntHandlerUSART3        (void)  { BSP_IntHandler(BSP_INT_ID_USART3);          }
void  BSP_IntHandlerEXTI15_10     (void)  { BSP_IntHandler(BSP_INT_ID_EXTI15_10);       }
void  BSP_IntHandlerRTCAlarm      (void)  { BSP_IntHandler(BSP_INT_ID_RTCAlarm);        }
void  BSP_IntHandlerUSBWakeUp     (void)  { BSP_IntHandler(BSP_INT_ID_USBWakeUp);       }


在每个中断向量入口函数当中调用BSP_IntHandler     (CPU_DATA  int_id)函数

使用特权

评论回复
11
machunshui| | 2009-7-28 18:10 | 只看该作者

BSP_IntHandler()函数

static  void  BSP_IntHandler (CPU_DATA  int_id)
{
#if (CPU_CFG_CRITICAL_METHOD == CPU_CRITICAL_METHOD_STATUS_LOCAL)
    CPU_SR         cpu_sr;
#endif
    CPU_FNCT_VOID  isr;


    CPU_CRITICAL_ENTER();                                       /* Tell uC/OS-II that we are starting an ISR            */
    OSIntNesting++;
    CPU_CRITICAL_EXIT();

    if (int_id < BSP_INT_SRC_NBR) {
        isr = BSP_IntVectTbl[int_id];
        if (isr != (CPU_FNCT_VOID)0) {
            isr();
        }
    }

    OSIntExit();                                                /* Tell uC/OS-II that we are leaving the ISR            */
}


BSP_IntHandler()函数先是做完UCOS要做的公共的事情,然后:

if (isr != (CPU_FNCT_VOID)0) {
            isr();
        }
用函数指针调用用户中断处理程序

使用特权

评论回复
12
machunshui| | 2009-7-28 18:17 | 只看该作者

如此简洁

OSIntCtxSw
    LDR     R0, =NVIC_INT_CTRL                                  ; Trigger the PendSV exception (causes context switch)
    LDR     R1, =NVIC_PENDSVSET
    STR     R1, [R0]
    BX      LR

突然发现UCOS在STM32下移植中断任务环境切换如此简洁!

改天真要好好看看

使用特权

评论回复
13
yxdengos|  楼主 | 2009-9-1 12:19 | 只看该作者
前段时间一直忙别的事情 谢谢ls的了

顶一下!欢迎大家讨论

使用特权

评论回复
14
yxdengos|  楼主 | 2009-9-2 15:43 | 只看该作者

使用特权

评论回复
15
drydiy| | 2013-11-1 14:58 | 只看该作者
要用到这三个函数,参考下面
BSP_IntVectSet(BSP_INT_ID_DMA1_CH5, UART1Rx_DMA1_CH5_Interrupt);
        BSP_IntPrioSet(BSP_INT_ID_DMA1_CH5, DMA1_CH5_UART1Rx_UIP);
        BSP_IntEn(BSP_INT_ID_DMA1_CH5);

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

28

主题

132

帖子

0

粉丝