zoukankan      html  css  js  c++  java
  • uCOSII移植STM32F10x_Keil

    【@.1 移植步骤】

    网上关于STM32的移植工程很多,不过实际上很多移植工程其中的中断都不能用的,因为没有把STM32中断入口地址与uCOS-II的中断管理机制联系在一起。估计很多移植工程只是简单的写了些跑马灯就好了,没有具体写中断函数测试。这里的移植过程跟我之前做过的LPC2119移植过程类似,也是改文件,改函数名,但是还是那句话,如果你不了解CPU的内核机制,中断机制,以及OS的任务调度原理,照着别人的移植工程不求甚解,是得不到提升的。

    工程目录建立参考LPC2119,拷贝文件来源于官方移植工程Micrium_STM32xxx_uCOS-II.exe。具体的详细步骤我有机会再详细写写,包括STM32中与ARM7的中断方式的差异。移植时主要注意一下三个关键即可:

    关键1:stm32中的Systick中断的替换OS中的ticker
    关键2:PendSV中断的替换成OS中的OSCtxSw()
    关键3:所有外设中断入口需重写(先经过OS调用后再进入中断服务程序)

    大致的流程如下:

    1.os_cpu_a.asm 中用 PendSV_Handler 代替 OS_CPU_PendSVHandler用作PendSV中断,同时注释掉stm32f10x_it.h和stm32f10x_it.c中PendSV_Handler()函数定义,在os_cpu.h中注释掉OS_CPU_PendSVHandler()函数声明替换为PendSV_Handler()的申明。

    2.注释掉os_cpu.h和os_cpu.c中OS_CPU_SysTickHandler()相关代码,将其内部代码复制到stm32f10x_it.c中的SysTick_Handler()下。注释掉os_cpu.h中OS_CPU_SysTickInit,OS_CPU_SysTickClkFreq的函数声明,这里是用移植工程中bsp中的相关函数初始化systick,之后改用标准库自己初始化。

    3.中断重写,用启动代码中中断函数名代替OS移植中的BSP_IntHandlerXXX(),放在stm32f10x_it.c和stm32f10x_it.h中,源bsp.c和bsp.h中的中断管理函数BSP_IntInit,BSP_IntEn,BSP_IntDis,BSP_IntClr,BSP_IntVectSet,BSP_IntPrioSet(参考移植工程)全改为STM_Int开头,放在stm32f10x_it.c和stm32f10x_it.h中,并在stm32f10x_it.c中添加static  CPU_FNCT_VOID  STM_IntVectTbl[STM_INT_SRC_NBR];定义用于中断函数存放。以后irq中断的注册,enable ,pending都可用移植工程中提供的方法而不用stm stdlib 3.5库中的函数,比如调用STM_IntVectSet函数进行中断服务函数的注册。

    我使用的目标开发板在另一篇博客中有介绍,移植的模板可以见最下面有下载。我在app.c中写了一个简单的测试应用,就是一个带外部中断的按键去抖操作。关于按键去抖在OS中的实现原理可以参考我的这篇文章的最后一个例子,即外部中断通过发送消息Post调度去抖任务,确认去抖之后再Resume对应的电机驱动任务。当然我在开发板中的电机驱动任务使用小灯闪烁来代替的。实际处理时我采用了动态改变中断服务函数的方法,即,当外部中断下降沿来临之后,会重新注册外部中断为上升沿触发,改变其对应的服务函数。

    模板下载:STM32_uCOSPrj.7z

    @.[FIN]      @.date->Mar 28, 2013      @.author->apollius

  • 相关阅读:
    [原][osg]Geometry详解
    [osg]节点遍历nodevisitor浅析
    [原][osg]osgconv浅析
    [原][游戏][攻略]仙之侠道玖章-- --从入门到放弃
    [转][linux]简单的linux下的tcp/udp
    [转][c++][跨平台]c++跨平台开发小结
    人机交互,来和我猜拳吧!
    从零开始学测试【1】测试方法术语总结
    从零开始学测试【2】网页登录界面
    JSP 和 ASP.NET 谁能主宰未来【转】
  • 原文地址:https://www.cnblogs.com/apollius/p/2987020.html
Copyright © 2011-2022 走看看