9回答

0收藏

systick中断服务函数的疑问

#开源分享 #开源分享 5052 人阅读 | 9 人回复 | 2014-06-02

悬赏10与非币已解决
共3个疑问:
1.为什么亮哥的SysTick_Handler  不是在 stm32f10x_it.c文件里的 void SysTick_Handler(void) 函数?

2.亮哥的 函数里有定义了一个   OS_CPU_SR  cpu_sr;  这个有什么作用?

3.亮哥的函数里用了     
    OS_ENTER_CRITICAL();                         /* Tell uC/OS-II that we are starting an ISR          */    OSIntNesting++;                                    
    OS_EXIT_CRITICAL();
    为什么不用OSIntEnter();进入中断,这里没有判断 OSIntNesting 是否小于255  ?


我初学的,比较菜,见笑了.

下面是原子的代码:  

//systick中断服务函数,使用ucos时用到
void SysTick_Handler(void)
{

最佳答案

查看完整内容

1.为什么亮哥的SysTick_Handler 不是在 stm32f10x_it.c文件里的 void SysTick_Handler(void) 函数? 答:在启动代码里,这里做了修改 DCD OS_CPU_PendSVHandler ; PendSV Handler DCD OS_CPU_SysTickHandler ; SysTick Handler 这里是中断向量表,也就是说当发生了SysTick中断,将执行OS_CPU_SysTickHandler 这个代码不带IT文件,在操作系统的移植文件中 2.亮哥的 ...
分享到:
回复

使用道具 举报

回答|共 9 个

倒序浏览

沙发

laoliang-67665

发表于 2014-6-2 22:30:24 | 只看该作者

本帖最后由 亮点 于 2014-6-3 18:39 编辑

1.为什么亮哥的SysTick_Handler  不是在 stm32f10x_it.c文件里的 void SysTick_Handler(void) 函数?
答:在启动代码里,这里做了修改
                DCD     OS_CPU_PendSVHandler             ; PendSV Handler
                DCD     OS_CPU_SysTickHandler            ; SysTick Handler
这里是中断向量表,也就是说当发生了SysTick中断,将执行OS_CPU_SysTickHandler
这个代码不带IT文件,在操作系统的移植文件中
2.亮哥的 函数里有定义了一个   OS_CPU_SR  cpu_sr;  这个有什么作用?
答:这个是临界区用的,进入临界区之前,将中断屏蔽寄存器的值保存到这个变量
出来的时候,恢复中断屏蔽寄存器
3. OS_ENTER_CRITICAL();                         /* Tell uC/OS-II that we are starting an ISR          */    OSIntNesting++;                                    
    OS_EXIT_CRITICAL();
因为使用了全局变量,因此用临界区保护了
OS_EXT  INT8U             OSIntNesting;  这个全局变量是8位的,因此不会大于255,不太可能中断嵌套到那么多层,放心使用

谢谢你的发帖,写的很清楚!
嵌入式,ucos,FPGA系统书籍作者
回复

使用道具 举报

板凳

乔麦

发表于 2014-6-2 22:34:22 | 只看该作者

上面代码没显示全: 
原子的代码void SysTick_Handler(void)
{                                  
        OSIntEnter();                //进入中断
    OSTimeTick();       //调用ucos的时钟服务程序               
    OSIntExit();        //触发任务切换软中断
}
回复

使用道具 举报

地板

乔麦

发表于 2014-6-2 22:35:02 | 只看该作者

亮哥的代码:
void  OS_CPU_SysTickHandler (void)
{
    OS_CPU_SR  cpu_sr;

        led_turn4;
        //GPIO_WriteBit(led_gpio, led1 , (BitAction)!GPIO_ReadOutputDataBit(led_gpio, led1));
        //GPIO_WriteBit(led_gpio, led4 , 1);
    OS_ENTER_CRITICAL();                         /* Tell uC/OS-II that we are starting an ISR          */
    OSIntNesting++;
    OS_EXIT_CRITICAL();

    OSTimeTick();                                /* Call uC/OS-II's OSTimeTick()                       */

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

使用道具 举报

5#

乔麦

发表于 2014-6-3 12:28:37 | 只看该作者

谢谢,讲解得很清楚
回复

使用道具 举报

6#

韩解嘲

发表于 2014-6-10 14:10:10 | 只看该作者

亮哥认真负责
回复

使用道具 举报

7#

韩解嘲

发表于 2014-6-10 14:11:32 | 只看该作者

亮哥认真负责
回复

使用道具 举报

8#

yjdhqcc8969

发表于 2014-7-30 13:47:50 | 只看该作者

认真负责。           
回复

使用道具 举报

9#

说不定

发表于 2014-8-2 13:30:24 | 只看该作者

卢老师,讲解非常详细 赞一个
回复

使用道具 举报

10#

wolfhead0318

发表于 2016-1-22 14:11:09 | 只看该作者

不错 !学习学习!!!!!!!!!!!!!
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条