最近做想做 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范围是

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

 

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的系统代码。

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-06-07
  • 2022-12-23
  • 2022-12-23
  • 2022-01-16
  • 2021-07-03
  • 2021-06-26
猜你喜欢
  • 2021-10-05
  • 2022-12-23
  • 2021-07-30
  • 2022-12-23
  • 2022-02-07
  • 2022-12-23
  • 2021-04-01
相关资源
相似解决方案