最近做想做 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的系统代码。

Micrium DEMO9S12NE64 uCOS-II 官方包 调试记录!相关推荐

  1. IAR中移植UCOS II系统以及sourceInsight 使用

    ucos 学习笔记 1 sourceInsight 使用 CSDN参考链接 新建工程 第一步:project中new project 第二步:在高亮部分输入工程的地址,工程文件夹与IAR工程文件夹放在 ...

  2. 【以太网模块调试记录】ZLG EPORTM集成式RJ45调试记录(STM32/GD32)

    ZLG(致远电子)集成式RJ45模块调试记录 集成了RJ45网络接口和PHY芯片(YT8512H) 官网链接:https://www.zlg.cn/Ethernet/Ethernet/product/ ...

  3. ucos ii堆栈大小检测

    在使用ucos ii时经常会有疑问,这个堆栈该给多大,虽然ucos ii 自带了任务堆栈检测,但是我觉得太麻烦了,而且还会占用资源,我投机取巧的使用内存是否为0来判断堆栈是否使用过,进而检测出堆栈的最 ...

  4. ROS上同时预览depth,IR,RGB 调试记录

    ROS上同时预览depth,IR,RGB 调试记录 用rviz同时显示RGB,IR,DEPTH(验证设备:astraprosm,canglong2,deeyea) 1.编译libuvc库 cd lib ...

  5. lwip协议栈在linux运行,LwIP协议栈在uCOS II下的实现

    1.概述: LwIP协议栈在设计时就考虑到了将来的移植问题,因此把所有与硬件.OS.编译器相关的部份独立出来,放在ucosii&LwIPsource etlwiparch目录下.因此LwIP在 ...

  6. ADF4350调试记录及频点锁定

    ADF4350调试记录及频点锁定 简介 宽带频率合成器,集成VCO 控制时序 调试记录 无法锁定 最开始,一直无法锁定,参考的官方例子程序,硬件外围电路也排查了好几遍,环路滤波带宽等设定,硬件软件来回 ...

  7. 现在考Oracle 19c OCP还需要官方的培训记录吗?

    内容说明:长期以来获得Oracle OCP(Oracle Certified Professional)的认证需要参加Oracle的官方或者合作伙伴组织的培训.我的很多学员向姚远老师抱怨这数千元的培训 ...

  8. WK2204 - spi转uart调试记录

    WK2204 - spi转uart调试记录 硬件 芯片简介 电路设计 驱动 添加设备树 添加驱动 调试 查看启动加载 检查串口通信 数据乱码或丢失 RS485只能收不能发 系统中断响应异常 思考 硬件 ...

  9. 在ADSP21489下外挂S29AL016J并行FLASH调试记录

    我哭,调试了5天 总结下在ADSP21489下挂S29AL016J并行flash调试记录 S29AL016J:2M*8bit 21489EZ-Kite M29W320EB: 4M*8Bit 在修改fl ...

  10. rk3368 Android9.0 HIDL调试记录

    rk3368 Android9.0 HIDL调试记录 Platform: RK3368 OS: Android 9.0 Kernel: 4.4.194 文章目录 rk3368 Android9.0 H ...

最新文章

  1. SpringBoot静态获取 bean的三种方式,你学会了吗?
  2. RedHat之yum解决办法
  3. Android自定义水波纹动画Layout
  4. 11g compression 新特性(1)
  5. 现代制造工程——考试复习01
  6. SQL Server 2008 R2 Developer Edition图文安装教程
  7. java接口import_深入理解Java架构师在组件注册@Import导入容器(ImportSelector接口)的神操作!...
  8. 网络IO模型详细分析
  9. 【英语学习】【Daily English】U10 Education L02 I'm not a pushy parent
  10. opencv复杂变换cvPyrDown [6]
  11. python和c先学哪个-python和c先学哪个
  12. 华为交换机忘记密码怎么办啊,华为交换机登陆密码忘了怎么办
  13. 模糊综合评价模型(下:多级)
  14. android 分区 加密软件,VeraCrypt(硬盘分区加密软件)
  15. editplus文本编辑器添加语法高亮
  16. 基于python的税额计算器
  17. 魏尔斯特拉斯---严谨的典范
  18. Open OnDemand部署安装使用手册
  19. 网传学习通1.7亿密码泄露:有什么补救措施?
  20. 电脑增加机械硬盘计算机管理,电脑新增加一块硬盘安装并使用的教程

热门文章

  1. JavaScript参考文档
  2. 文件md5怎么会变化
  3. DeepMOT: A Differentiable Framework for Training Multiple Object Trackers
  4. VUE 动态响应的实现
  5. 开关电源中输出电容的ESR会影响负载的动态响应
  6. 新建word文档如何删掉页眉横线
  7. 破解新浪微博js加密登陆超详细
  8. PostgreSQL 源码解读(152)- PG Tools#4(ReceiveXlogStream)
  9. 关于圆的角度和弧度的计算公式
  10. Android11(R) system_ext 分区 system_ext_specific 属性