开启辅助访问 切换到窄版

打印 上一主题 下一主题

UCOSIII移植——STM32F769I 图像处理能力评测之五

[复制链接]
版块:
嵌入式操作系统 其他嵌入式相关 发布时间:2018-7-22 18:54:09
8130
楼主
跳转到指定楼层
| 只看该作者 回帖奖励 |倒序浏览 |阅读模式
硬件平台:STM32F769IDISCOVERY
软件平台:KEIL5.1
UCOSIII简介:
  uC/OS-III是一个可扩展的,可固化的,抢占式的实时内核,它管理的任务个数不受限制。它是第三代内核,提供了现代实时内核所期望的所有功能包括资源管理、同步、内部任务交流等。uC/OS-III 也提供了很多特性是在其他实时内核中所没有的。比如能在运行时测量运行性能,直接发送信号或消息给任务,任务能同时等待多个信号量和消息队列。它与UCOSII的最大不同之处在于:
   1.对任务数量没有要求,对任务的优先级没有要求,允许存在同一优先级不同的任务。
   2.支持时间片轮转。对相同优先级的任务,允许设置每个任务运行的时间,按顺序执行任务。
   3.取消消息邮箱,不通过消息队列发消息给任务,不通过信号量标记任务。
   4.支持运行时配置,任务的停止与恢复支持嵌套。
UCOSIII移植:
   由于我之前第二个评测时,已经创建了一个工程文件,实现了最基本的功能--LED灯的闪烁。因此,我们依然使用这个工程文件来进行移植,要实现的功能依然是LED灯的闪烁。
工程文件的下载地址:创建第一个工程文件——STM32F769I图像处理能力评测之二(http://bbs.eeworld.com.cn/thread-510110-1-1.html)
好了,接下来开始移植:
   1.登录MICRIUM官网,下载UCOSIII。下载地址:http://www.micrium.com/downloadcenter/download-results/?searchterm=mi-stmicroelectronics-stm32f7xx&supported=true。由于官方基本都是使用IAR平台进行UCOS的移植,并没找到MDK平台的移植,不过没关系,可以下载下来,重新进行移植。官网移植的芯片针对STM32F746,并没有STM32F769,但是二者都是基于M7内核,除了外设和浮点运算,基本上差异不大。

原版的UCOSIII工程文件,在附件里有提供。
2.打开之前的工程文件,创建一个文件夹,命名为UCOSIII。然后在里面创建5个子文件夹,依次为APP、BSP、uC_CPU、uC _LIB 和uCOS-III。APP文件夹用于存放我们编写的应用程序,比如我们要实现的LED闪烁,以及应用程序的配置,比如堆栈的配置。BSP文件夹主要用于配置底层驱动,比如IO口的配置。uC_CPU文件夹是存放UCOS与目标芯片相关的内核文件。uC _LIB文件夹存放UCOS相关的库函数,比如:数学运算、字符串转换。uCOS-III文件夹存放操作系统的内核文件。如下图所示:

创建UCOSIII文件夹

UCOSIII文件夹下创建5个文件夹
  3.打开uC_CPU文件夹,并创建如下3个文件夹:

  打开uC _LIB文件夹,并创建如下3个文件夹:

   打开uCOS-III文件夹,并创建如下3个文件夹:

4.解压我们刚才下载的UCOSIII工程文件,开始添加文件。找到如下文件路径,添加文件到我们刚才新创建的文件夹uCOS-III\Source。

   找到如下文件路径,添加文件到我们刚才新创建的文件夹uCOS-III\Port。



  找到如下文件路径,添加文件到我们刚才新创建的文件夹uCOS-III\Config。

至此,uCOS-III文件夹的文件添加完毕。

5.找到如下文件路径,添加文件到我们刚才新创建的文件夹uC _LIB\Source。

找到如下文件路径,添加文件到我们刚才新创建的文件夹uC _LIB\Port。


找到如下文件路径,添加文件到我们刚才新创建的文件夹uC _LIB\Config。

至此,uC _LIB文件夹的文件添加完毕。

   6.找到如下文件路径,添加文件到我们刚才新创建的文件夹uC _CPU\Source


  找到如下文件路径,添加文件到我们刚才新创建的文件夹uC _CPU\Port。


找到如下文件路径,添加文件到我们刚才新创建的文件夹uC _CPU\Config。

至此,uC _CPU文件夹的文件添加完毕。
  7.找到如下文件路径,添加文件到我们刚才新创建的文件夹APP,并把文件app_main.c修改为app.c

8.找到如下文件路径,添加文件到我们刚才新创建的文件夹BSP





  9.至此,我们已经把UCOSIII的文件添加到项目中。接着打开KEIL工程文件,将刚才添加的UCOSIII文件添加到KEIL项目中,添加完成后如下图所示:

创建APP目录,添加APP文件夹下的文件

创建BSP目录,添加BSP文件夹下的文件

创建uC_CPU_Port目录,添加uC_CPU\Port文件夹下的文件

创建uC_CPU_Souce目录,添加uC_CPU\Souce文件夹下的文件

创建uC_CPU_Config目录,添加uC_CPU\Config文件夹下的文件

创建uC_LIB_Port目录,添加uC_ LIB\Port文件夹下的文件

创建uC_LIB_Source目录,添加uC_ LIB\Source文件夹下的文件

创建uC_LIB_Config目录,添加uC_ LIB\Config文件夹下的文件

创建uCOS _Port目录,添加uCOS-III\Port文件夹下的文件

创建uCOS _Source目录,添加uCOS-III\Source文件夹下的文件

创建uCOS _Config目录,添加uCOS-III\Config文件夹下的文件
10.待上述步骤完成后,开始修改文件。打开uC_CPU_Port目录下的cpu_a.asm文件,按如下步骤进行修改:
   1.修改第39行——第51行的内容,修改完成后如下所示:

  2.修改第58行——第59行的内容,修改完成后如下所示:

   3.修改第129行的内容,将其改为:CPU_WaitForInt
  4.修改第144行的内容,将其改为:CPU_ CPU_WaitForExcept
   5.修改第191行的内容,将其改为:CPU_CntLeadZeros
6.修改第238行的内容,将其改为:CPU_CPU_CntTrailZeros
   7.修改第273行的内容,将其改为:CPU_CPU_CPU_RevBits
  11.打开uC_CPU_Port目录下的cpu.h文件,按如下步骤进行修改:
   1.删除第86行的内容。
2.修改第318行的内容,将其改为:
#define CPU_INT_DIS()   do { cpu_sr= CPU_SR_Save(); } while (0)
  3.修改第319行的内容,将其改为:
#defineCPU_INT_EN()    do { CPU_SR_Restore(cpu_sr); } while(0)
  4.修改第353行的内容,将其改为:
#define CPU_MB()   __dsb(0xF)
  5.修改第354行的内容,将其改为:
#define CPU_RMB()  __dsb(0xF)
  6.修改第355行的内容,将其改为:
#define CPU_WMB()  __dsb(0xF)
  12.打开uC_CPU_Config目录下的cpu_cfg.h文件,按如下步骤进行修改:
  1.修改第101行的内容,将其改为:
#define CPU_CFG_TS_32_EN        DEF_DISABLED
  2 .修改第131行的内容,将其改为:
#if 0
#define CPU_CFG_INT_DIS_MEAS_EN
#endif
  13.打开uC_LIB_Port目录下的lib_mem_a.asm文件,按如下步骤进行修改:
  1.修改第56行的内容,将其改为:EXPORTMem_Copy
   2.修改第63行的内容,修改完成后,如下所示:

  3.修改第105行的内容,将其改为:Mem_Copy
   4.修改第110行的内容,将其改为:Mem_Copy_1
5.修改第115行的内容,将其改为:Mem_Copy_2
   6.修改第120行的内容,将其改为:Mem_Copy_3
   7.修改第124行的内容,将其改为:Chk_Align_32
8.修改第133行的内容,将其改为:Pre_Copy_1
9.修改第140行的内容,将其改为:Pre_Copy_1_Cont
10.修改第148行的内容,将其改为:Chk_Align_16
   11. 修改第155行的内容,将其改为:Pre_Copy_2
   12. 修改第166行的内容,将其改为:Copy_32_1
   13. 修改第190行的内容,将其改为:Copy_32_2
  14. 修改第198行的内容,将其改为:Copy_32_3
  15. 修改第206行的内容,将其改为:Copy_16_1
  16. 修改第244行的内容,将其改为:Copy_16_2
  17. 修改第252行的内容,将其改为:Copy_08_1
  18. 修改第290行的内容,将其改为:Copy_08_2
  19. 修改第299行的内容,将其改为:Mem_Copy_END
  14.打开uC_LIB_Config目录下的lib_cfg.h文件,按如下步骤进行修改:
  1. 修改第72行的内容,将其改为:
#define LIB_MEM_CFG_ARG_CHK_EXT_EN  DEF_ENABLED
  2. 修改第118行的内容,定义UCOS的动态内存,根据需要进行修改,我这里改为2k动态内存,将其改为:
#define LIB_MEM_CFG_HEAP_SIZE    (2u * 1024u)
  15.打开uCOS _Port目录下的os_cpu_a.asm文件,按如下步骤进行修改 :
  1. 修改第34行——第51行的内容,修改完成后如下所示:

  2.修改第68行——第69行的内容,修改完成后如下所示:

  3.修改第83行——第94行的内容,修改完成后如下所示:

  4.修改第108行——第115行的内容,修改完成后如下所示:

16.打开uCOS _Port目录下的os_cpu_c.c文件,按如下步骤进行修改:
  1. 修改第60行的内容,将其改为:#include"os.h"
17.打开uCOS _Port目录下的os_cpu.h文件,按如下步骤进行修改:
  1. 修改第76行的内容,将其改为:#ifdef__TARGET_FPU_VFP
   2.修改第91行的内容,将其改为:
#define OS_TASK_SW_SYNC()   __isb(0xF)
18.打开uCOS_Config目录下的os_cfg.h文件,对UCOS系统组件进行裁剪,这个根据自己项目的需要。我这里做如下修改:
  1. 修改第46行的内容,将其改为:
#define OS_CFG_TS_EN      DEF_DISABLED    //禁止时间戳
   2.修改第51行的内容,将其改为:
#define OS_CFG_SCHED_ROUND_ROBIN_EN DEF_ENABLED      //使能时间片轮转
   3. 修改第57行的内容,将其改为:
#define OS_CFG_FLAG_EN      DEF_DISABLED      //禁止事件标志
   4. 修改第74行的内容,将其改为:
#define OS_CFG_Q_EN       DEF_DISABLED     //禁止消息队列
   5. 修改第96行的内容,将其改为:
#define OS_CFG_TASK_DEL_EN    DEF_ENABLED          //使能任务删除
  19.打开uCOS _Config目录下的os_cfg_app.h文件,这里可以修改中断堆栈的大小,统计任务的优先级、运行频率和堆栈大小、定时器任务的优先级、定时时间和堆栈大小等等。可以根据项目需要进行修改,我这里做如下修改:
  1.修改第63行的内容,将其改为:
#define OS_CFG_TICK_TASK_PRIO    2u      //滴答定时器任务的优先级为2级
20.打开BSP目录下的bsp.c文件,这个文件用来编写与底层硬件驱动相关的各种函数接口。我们要在这里完成LED驱动函数的编写。我这里做如下修改:
  1. 删除第45行至第47行的内容,这两个是原版工程文件定义头文件,我们不需要。
   2.添加LED初始化函数。

  3.添加系统滴答定时器的初始化函数。

  4.修改BSP_Init函数。

  21.打开APP目录下的app_cfg.h文件,这个文件用来定义我们所编写任务的优先级及其堆栈大小。我们的目标实现LED的闪烁功能,因此,只需要一个任务初始化函数,并在里面实现LED的闪烁。我这里做如下修改:
  1. 修改第52行的内容,将其改为:
#define APP_CFG_TASK_START_PRIO1u  //UCOS启动后,第一个调用的任务。设置优先级为1
  2. 删除第53行和第54行的内容,这两个是原版工程文件定义的任务优先级,我们不需要。
  3. 删除第64行和第65行的内容,这两个是原版工程文件定义的任务的堆栈大小,我们不需要。
  22.打开APP目录下的app.c文件,这个文件是供用户编写任务函数的地方。我这里做如下修改:
  1. 删除第54行和第55行的内容,这两个是原版工程文件定义的头文件,我们不需要。
  2. 删除第62行和第63行的内容,这两个是原版工程文件的定义,我们不需要。
  3.修改第72行的内容,将其改为:OS_TCB   AppTaskStartTCB;
  4. 修改第73行的内容,将其改为:CPU_STK  AppTaskStartStk[APP_CFG_TASK_START_STK_SIZE];
  5. 删除第76行至第102行的内容, 我们只保留起始任务相关的定义,其余一概不要。
  6.修改第82行的内容,将其改为:voidAppTaskStart (void*p_arg);
  7. 删除第83行至第89行的内容, 我们只保留起始任务相关的定义,其余一概不要。
  8. 保留AppTaskStart函数定义,其余函数定义一概不要。
  9. 修改AppTaskStart函数,完成LED闪烁功能, 如下所示:

  23.打开CMSIS目录下的startup_stm32f769xx.s文件,对堆栈和堆得大小做出修改,这个要根据实际项目的需求做出更改,我这里做如下修改:
  1.修改第48行的内容,将其改为:Stack_Size  EQU 0x00001000;
  2.修改第59行的内容,将其改为:Heap_Size   EQU 0x00001000
  3.将该文件里的关键字PendSV_Handler,全部用OS_CPU_PendSVHandler替代。
  24.打开USER目录下的stm32f7xx_it.c文件,修改滴答定时器中断函数。
  1.添加头文件  #include "os.h"
  2.添加头文件  #include "stm32f7xx_hal.h"
  3.修改滴答定时器中断函数
25. 打开USER目录下的main.c文件,做如下修改:

  1.添加头文件  #include "os.h"
   2.添加头文件  #include"app_cfg.h"
  3.删除之前定义的的LED初始化函数和延时函数
  4.添加外部声明extern OS_TCB   AppTaskStartTCB;
  5.添加外部声extern CPU_STK AppTaskStartStk[APP_CFG_TASK_START_STK_SIZE];
  6.添加外部声明extern void AppTaskStart( void *p_arg );
  7.对main函数进行修改,如下所示


   26.至此,所有的文件修改完毕。接下来只要设置Keil的包含文件路径,就可以进行编译,下载到开发板中。本应该在这个章节测试LORA模块,板子周围的原件基本焊接完成,但是两块主芯片sx1276和stm32l152迟迟未到,看来计划要泡汤了,对此抱歉哈。
欢迎点击阅读原文与作者交流、沟通。


关注EEWORLD(电子工程世界)微信公众号:回复“投稿”,您的原创将有机会出现在我们的微信推送中。

与更多行业内网友进行交流请点击阅读原文登陆EEWORLD论坛。

微信号:EEWORLD
精彩热帖E手掌握关注EEWORLD服务号
EE福利唾手可得
微信号:EEXINRUI
芯片资讯 锐利解读

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表