您的位置:首页 > 其它

Micrium DEMO9S12NE64 uCOS-II 官方包 调试记录!

2017-08-23 23:46 260 查看
最近做想做 TCP/IP 的一个测试,准备选择使用MC9S12NE64,此款芯片集成了网络的物理层,硬件很简洁,16位的MCU,速度还可以,能做10/100M的网络传输,想直接在UCOSII平台上来做,于是去Micrium官方下载了该芯片的DEMO软件包是UCSOII 2.9版本的,包中现成的工程是CW4.5版本,没有装,直接用CW5.0打开,编译会有错误。发现编译中出现了很多错误,和CW的版本没有关系,感觉大部分都是人为造成的,只有一点一点的解决,因为官方的工程包中使用的是P&E
Multilink开发工具,我这里使用的自制的BDM工具,无法使用,工程中也无法更改开发工具,没有办法,只有重新新建一个新的CW5.0的工程,添加相关的文件到新工程中,包括源文件和PRM文件,并将OS换成UCOSII 2.52,其实就是复制原包中的那三个文件即可,然后加入2.52的源码,编译成功,只有几条无关紧要的警告,下载到板子里,运行,发现不对,从START12.C文件进到main中的时候,无法进入函数,并且汇编窗口全是BGND,BGND指令就是代表进入到BDM调试状态,查看MAP文件,基本上函数和变量都没有问题,这个让我很奇怪,于是我就打开PRM文件,打开看了看,发现了问题,原版工程的PRM文件,中的RAM地址范围的定义如下:

NAMES
END

SECTIONS 

    /* RAM                                           */ 
    RAM      = READ_WRITE 0x2000 TO 0x3FFF;     
    
    /* unbanked FLASH ROM */
    NV_VARS  = READ_ONLY  0x4000 TO 0x41ff;  /* 512B */
    ROM_4200 = READ_ONLY  0x4200 TO 0x7FFF;  /* 16K  */
    ROM_C000 = READ_ONLY  0xC000 TO 0xF7FF;
    
    /* banked FLASH ROM */
    PAGE_3C  = READ_ONLY  0x3C8000 TO 0x3CBFFF;   
    PAGE_3D  = READ_ONLY  0x3D8000 TO 0x3DBFFF;   
END

PLACEMENT
    _PRESTART,                   /* Used in HIWARE format: jump to _Startup at the code start */
    STARTUP,                     /* startup data structures */
    ROM_VAR,                     /* constant variables */
    STRINGS,                     /* string literals */
    NON_BANKED,                  /* runtime routines which must not be banked */
    COPY                         /* copy down information: how to initialize variables */
                                 INTO  ROM_4200,ROM_C000;
    DEFAULT_ROM                  INTO  PAGE_3C,PAGE_3D, ROM_4200, ROM_C000;
    DEFAULT_RAM                  INTO  RAM;
END

STACKSIZE 0x0100

见红色部分,而DS手册上的RAM范围是





NE64是带内存地址重映射功能的,上电复位的默认是没有映射的,其中低的1K字节和寄存器区域是重叠的,如果不重新映射的话,这1K字节的RAM空间就无法使用,估计原版包中初始化的时候,对RAM做了重映射,才把PRM文件进行了更改。我这里是没有做映射的,所以地址空间是从 0X400 - 0X1FFF,   再CW5.0中新建的NE64的工程,其中的PRM内容如下:

/* RAM */
      RAM           = READ_WRITE    0x0400 TO   0x1FFF;

/* non-paged FLASHs */
      ROM_4000      = READ_ONLY     0x4000 TO   0x7FFF;
      ROM_C000      = READ_ONLY     0xC000 TO   0xFEFF;
 /*   VECTORS       = READ_ONLY     0xFF00 TO   0xFFFF; intentionally not defined: used for VECTOR commands below */
   //OSVECTORS      = READ_ONLY     0xFF8C TO   0xFFFF;   /* OSEK interrupt vectors (use your vector.o) */

/* paged FLASH:                     0x8000 TO   0xBFFF; addressed through PPAGE */
      PAGE_3C       = READ_ONLY   0x3C8000 TO 0x3CBFFF;
      PAGE_3D       = READ_ONLY   0x3D8000 TO 0x3DBFFF;
/*    PAGE_3E       = READ_ONLY   0x3E8000 TO 0x3EBFFF; not used: equivalent to ROM_4000 */
/*    PAGE_3F       = READ_ONLY   0x3F8000 TO 0x3FBEFF; not used: equivalent to ROM_C000 */
END

PLACEMENT /* here all predefined and user segments are placed into the SEGMENTS defined above. */
      _PRESTART,              /* Used in HIWARE format: jump to _Startup at the code start */
      STARTUP,                /* startup data structures */
      ROM_VAR,                /* constant variables */
      STRINGS,                /* string literals */
      VIRTUAL_TABLE_SEGMENT,  /* C++ virtual table segment */
    //.ostext,                /* OSEK */
      NON_BANKED,             /* runtime routines which must not be banked */
      COPY                    /* copy down information: how to initialize variables */
                              /* in case you want to use ROM_4000 here as well, make sure
                                 that all files (incl. library files) are compiled with the
                                 option: -OnB=b */
                        INTO  ROM_C000/*, ROM_4000*/;

      DEFAULT_ROM       INTO  PAGE_3C, PAGE_3D                  ;

    //.stackstart,            /* eventually used for OSEK kernel awareness: Main-Stack Start */
      SSTACK,                 /* allocate stack first to avoid overwriting variables on overflow */
    //.stackend,              /* eventually used for OSEK kernel awareness: Main-Stack End */
    DEFAULT_RAM         INTO  RAM;

  //.vectors            INTO  OSVECTORS; /* OSEK */
END

ENTRIES /* keep the following unreferenced variables */
    /* OSEK: always allocate the vector table and all dependent objects */
  //_vectab OsBuildNumber _OsOrtiStackStart _OsOrtiStart
END

STACKSIZE 0x100

蓝色部分的地址范围和DS上说的一致,所以,将地址改为默认的,重新编译,调试成功,问题解决。然后写了1个简单的LED测试的任务,看任务切换是否有问题,编译,下载,调试,果然有问题,调试进入到OS_Start()函数中,执行到汇编的 OSStartHighRdy 代码的 RTI指令恢复任务的堆栈的时候,发现CPU的寄存器区域的数据全部乱了,PC指针,X,Y,D,CCR等都是错位的,但是堆栈指针的大致范围还是待运行任务的堆栈范围。 想可能是在堆栈初始化函数的入栈顺序有问题,一查也没有问题,这就奇怪了,然后,想到之前用HY64的做过UCOSII,将代码调出来,比较一看,发现了问题,问题出在OS_CUP.H中,
数据类型定义错误,先还以为是官方包的问题,打开一看,没有问题,后来才想到,我的2.52的UCOSII的源码是从邵贝贝书籍配套的源码中提取的,里面的数据类型是根据PC机修改的,我直接复制过来了,呵呵。。。。更正过来,编译,下载,运行,OK,,,任务运行,切换都没有问题了。。。

以上2个问题,其实是在切换OS版本平台的时候,自己马虎的原因造成的,也说明了功底不够啊! 还需要进一步努力。。。解决了就好。。。。

有2个小问题,提示一下,
1. 在 BSP.H中的 OSTickISR_Init 函数的最后,有一句

TSCR1 = 0xC0;                           /* Enable counter & disable counter in background mode     */

我想作者的想法是想在调试的时候,关闭OS TICK,避免单步调试的时候进入TICK中断,这里这句达不到这个功能,做如下赋值,就行了。

TSCR1 = 0xE0;                           /* 使能计数器,但在单步调试的BDM状态下,关闭计数器,防止单步调试发生TICK中断的发生 */
我看是作者太忙了,马虎了,BIT7 = 1 ,是说在CPU在WAIT模式的时候,关闭定时器,BIT6 = 1, 是说CPU 不在全速运行的时候,关闭定时器。

2. 原版中的PRM文件中DEFAULT ROM的内容,
DEFAULT_ROM                  INTO  PAGE_3C,PAGE_3D, ROM_4200, ROM_C000;
经过测试,编译器会优先分配写在前面的FLASH空间,以此类推,由于希望UCOS运行的速度越快越好,所以建议这样写
DEFAULT_ROM                  INTO  ROM_4200, ROM_C000, PAGE_3C,PAGE_3D ;
这样的话,优先的分配的非分页区,指令寻址更快一些。当然,如果应用代码较大,编译器极有可能将UCOSII的代码编译到分页区。所以建议专门在非分页区开一个区,用来存放UCOSII的系统代码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: