1、移植过程
在将ucos移植到28377d平台上时主要遇见了下面几个问题,
1) 文件怎么组织,是通过修改micrim上提供的28335一直代码修改而成的,下载地址为:https://www.micrium.com/。
2)移植完成后发现创建任务完成后,任务无法跳转,移植在主函数中来回循环
3)当使用ostimedly()函数对任务延时,当延时时间已经完成,系统无法跳出空任务循环,移植在IdleTask中运行
4)任务切换过程中总是跳入到异常中断中。
移植思路:
开始移植过程时,下载了micrium官网上提供的关于28335的移植历程,他的历程导入后整体框架如下图所示:
上图中主要包含了5个文件夹分别是APP BSP UC-CPU UC-LIB UCOS-II
APP 主要包含了应用代码,主要是官方自己编写的一个小程序,其中各种.h文件是对ucos的一些配置
BSP称作板级支持包,这个就按照通俗理解的官方提供的历程中所使用的各种.c文件,比如我需要控制IO口,就要使用F2837xD_GPIO.C中的一些函数,这些就是BSP
UC-CPU暂时未用,好像有包含
UC-LIB暂时未用,貌似是一些支持库,但是F28377D本身自带就有一些运算支持库
UCOS-II这个是重头戏,里面包含了两个文件夹
source 文件夹下是ucos的无关核代码,这些不需要修改
prots->c28x->generic->ccs里面的代码是和内核有关的代码,无非也就是操作堆栈,保存cpu的当前寄存器值以及恢复等等,这些是需要修改的
但是下载的代码已经帮我们修改好了。直接使用
最开始的移植思路是 :
BSP 板级支持包不使用micrum提供的,查阅代码可以发现BSP中无非就是对外设的控制和上电初始化芯片的过程,这些完全可以倒入一个F28377D的历程
使用历程中的例子来完成初始化,这样更加方便
提供给ucos的时间中断,这个就人为的使用cputimer来做一个中断,中断函数里面调用ostimetick函数来实现。
步骤如下:
首先在28377D的历程中导入一个blink灯闪的历程,修改后的框架如下图所示:
同样包含了下面几个文件夹,这个只是我自己用的,和历程不一样,这个是随意的:
cmd driver pcore uc-cpu uc-lib ucos-ii
cmd中存放的是历程的cmd文件
driver存放的就是那些调用外设的驱动程序,也就是用来替换BSP的
pcore是放置应用程序的。h文件的定义,直接从micrum中复制过来的
uc-cpu uc-lib ucos-ii 是和micrum提供的源码一样的(复制过来的)
主函数被放置在了processflow中,这里没有打开显示。
代码如下所示:
修改后的mian函数如下:
#include <string.h> #include "F28x_Project.h" #include "F2837xD_Ipc_drivers.h" #include <app_cfg.h> #include <ucos_ii.h> #include <cpu_core.h> #include <lib_def.h> __interrupt void cpu_timer0_isr(void); //#pragma CODE_SECTION(App_TaskStartStk , "RAMGS0"); //#pragma CODE_SECTION(App_TaskPendStk , "RAMGS0"); //#pragma CODE_SECTION(App_TaskPostStk , "RAMGS0"); CPU_STK_SIZE App_TaskStartStk[APP_CFG_TASK_STK_SIZE]; /* Ping Task's stack.*/ CPU_STK_SIZE App_TaskPendStk[APP_CFG_TASK_STK_SIZE]; /* Pong Task's stack.*/ CPU_STK_SIZE App_TaskPostStk[APP_CFG_TASK_STK_SIZE]; static OS_EVENT *AppTaskObjSem; /********************************************************************************************* ************ * FUNCTION PROTOTYPES ********************************************************************************************** *********** */ /* Start Task.*/ static void App_TaskStart(void *p_arg); /* Ping Task. */ //