DSP28335移植ucosii

在https://www.micrium.com/ 中,存在一个已经移植好的28335工程。但是这个工程问题很明显,就是缺乏相关寄存器的映射和定义。这就导致如果直接使用这个工程,一些.c和.h文件就要重新写,写的过程中错误不断…(好傻逼…)

文件分析

DSP28335移植ucosii_第1张图片这是一张ucos系统结构图,红色部分是与处理器无关的代码,可以直接移植,这部分代码是官方例程.\Micrium\Software\uCOS-II\Source路径下的部分;绿色的部分表示应用相关代码,其中os_cfg.h文件中包含大量宏定义,通过修改这些宏定义的值可以对操作系统进行裁剪;紫色的部分是与cpu相关的代码,移植的时候需要修改,对应位置是.\Micrium\Software\uCOS-II\Ports\C28x\Generic\CCS\。但是好处是这部分例程中都是修改好的,直接复制过去就可以了。

开始移植

DSP28335移植ucosii_第2张图片
1.移植官方文件。官网文件包括APP,BSP,UC_CPU,UC_LIB,UCOS_II。

  • APP包含了用户应用代码,其中各种.h文件是对ucos的一些配置。.h文件保留,并新建一个CONFIG文件夹保存起来。app.c文件删除,用自己写的文件代替。
  • BSP称作板级支持包,这个相当于官方提供的例程中所使用的各种.c文件。这部分可以直接放弃,因为如果裸板的工程师完整的,这些.c文件的内容都应该已经被囊括。如果保留这部分就会出现冲突。
  • uC_CPU是基于 micrium 官方评估板的 ucosii 移植代码,这个直接复制过来。
  • uC_LIB这个是micrium 官方的一个库代码,也复制过来。
  • uCOS_II这个文件是ucos_ii源代码,移植的时候需要修改的文件。但是官方已经帮我们修改好了。所以直接复制过来用就可以了。
    2.测试。移植完成之后需要测试,此时程序如下:
#include  
#include  
#include  
#include  
#include  

#include "DSP2833x_Device.h"     // DSP2833x 头文件
#include "DSP2833x_Examples.h"   // DSP2833x 例子相关头文件

#define LED1        GpioDataRegs.GPATOGGLE.bit.GPIO16
CPU_STK_SIZE  App_TaskStartStk[APP_CFG_TASK_STK_SIZE];
CPU_STK_SIZE  App_TaskPendStk[APP_CFG_TASK_STK_SIZE];
CPU_STK_SIZE  App_TaskPostStk[APP_CFG_TASK_STK_SIZE];

static  OS_EVENT    *AppTaskObjSem;

static  void  App_TaskStart(void  *p_arg);
static  void  App_TaskPing (void  *p_arg);
static  void  App_TaskPong (void  *p_arg);

interrupt void cpu_timer0_isr(void);  // 中断声明
void BSP_Tick_Init(void);

void BSP_Tick_Init(void)
{
    EALLOW;
    PieVectTable.TINT0 = &cpu_timer0_isr; // 定时器中断地址
    // PieVectTable.RTOSINT = &RTOSINT_ISR;    // test
    PieVectTable.RTOSINT = &OS_CPU_RTOSINT_Handler;  // RTOS
    // MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
    // InitFlash();  //初始化FLASH
    EDIS;
    InitCpuTimers();
    ConfigCpuTimer(&CpuTimer0, 60, 1000);  // test 500000
    CpuTimer0Regs.TCR.all = 0x4001; // 设置 TSS bit = 0
    IER |= M_INT1;   // CPU-Timer 0属于CPU INT1,使能:
    PieCtrlRegs.PIEIER1.bit.INTx7 = 1; // Enable TINT0 in the PIE: Group 1 interrupt 7
    EINT;   // 使能INTM中断
    ERTM;   // 使能DBGM中断
}
void main(void)
{
   InitSysCtrl();
   // InitGpio();  // 本例未用到  // 第二步:初始化GPIO:
   DINT;
   InitPieCtrl();
   IER = 0x0000;
   IFR = 0x0000;
   InitPieVectTable();

   EALLOW;
   GpioCtrlRegs.GPAMUX2.bit.GPIO16 = 0;  // LED0
   GpioCtrlRegs.GPADIR.bit.GPIO16 = 1;
   EDIS;
   EINT;   // 使能INTM中断
   ERTM;   // 使能DBGM中断

   OSInit();
   OSTaskCreateExt(App_TaskStart,
                   (void    *)0,
                   (CPU_STK *)&App_TaskStartStk[0],
                   (INT8U    )APP_CFG_TASK_START_PRIO,
                   (INT16U   )APP_CFG_TASK_START_PRIO,
                   (CPU_STK *)&App_TaskStartStk[APP_CFG_TASK_STK_SIZE - 1u],
                   (INT32U   )APP_CFG_TASK_STK_SIZE,
                   (void    *)0,
                   (INT16U   )(OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR));
   OSStart();
   while (DEF_TRUE) {
       ;
   }
}

static  void  App_TaskStart (void *p_arg)
{
    volatile CPU_INT08U  os_err;  // test
    (void)&p_arg;
    BSP_Tick_Init();
    AppTaskObjSem = OSSemCreate(0);

    OSTaskCreateExt(App_TaskPing,
                    (void    *)0,
                    (CPU_STK *)&App_TaskPendStk[0],
                    (INT8U    )APP_CFG_TASK_PEND_PRIO,
                    (INT16U   )APP_CFG_TASK_PEND_PRIO,
                    (CPU_STK *)&App_TaskPendStk[APP_CFG_TASK_STK_SIZE - 1u],
                    (INT32U   )APP_CFG_TASK_STK_SIZE,
                    (void    *)0,
                    (INT16U   )(OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR));
    OSTaskCreateExt(App_TaskPong,
                    (void    *)0,
                    (CPU_STK *)&App_TaskPostStk[0],
                    (INT8U    )APP_CFG_TASK_POST_PRIO,
                    (INT16U   )APP_CFG_TASK_POST_PRIO,
                    (CPU_STK *)&App_TaskPostStk[APP_CFG_TASK_STK_SIZE - 1u],
                    (INT32U   )APP_CFG_TASK_STK_SIZE,
                    (void    *)0,
                    (INT16U   )(OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR));
    while (DEF_TRUE) {
        os_err = OSSemPost(AppTaskObjSem);
        OSTimeDlyHMSM(0, 0, 0, 1);
    }
}
static  void  App_TaskPing (void *p_arg)
{
    CPU_INT08U  os_err;
    (void)&p_arg;
    while (DEF_TRUE)
    {
        OSSemPend( AppTaskObjSem,
                   0,
                  &os_err);
    }
}
static  void  App_TaskPong (void *p_arg)
{
    (void)&p_arg;
    while (DEF_TRUE)
    {
        OSTimeDlyHMSM(0, 0, 0, 300);   // test   before is 300
        LED1=1;
        CpuTimer0.InterruptCount++;    // test  仿真测试用
    }
}
interrupt void cpu_timer0_isr(void)
{
   PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
   // LED0=1;     // test
   // CpuTimer0.InterruptCount++;  //test
   OSIntEnter();
   OSTimeTick();
   OSIntExit();
}

此处执行的功能是:Gpio19反复翻转。
编译报错:
program will not fit into available
28335_RAM_lnk.cmd /lab3-timer0_LED line 126
错误位置指向:

.text            : > RAML1,     PAGE = 0

代码段不适应?之前裸板没有错误,现在加入了这么一堆代码报错,显然是原先分给代码段的空间不够用了。那就给代码段多分配一段空间。可以将其分配到FLASH当中,也可以将RAML2、RAML3分配给代码段。显然,flash的空间是足够大的,但是在flash中运行代码显然会减低代码运行速度。因此,优先将代码放到RAM当中。

MEMORY
{
PAGE 0 :
...
RAML1      : origin = 0x009000, length = 0x003000
...
}

问题解决。

用示波器测一测,完美方波。移植成功。

你可能感兴趣的:(UCOSii)