Micrium DEMO9S12NE64 uCOS-II 官方包 调试记录!
最近做想做 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 官方包 调试记录!相关推荐
- IAR中移植UCOS II系统以及sourceInsight 使用
ucos 学习笔记 1 sourceInsight 使用 CSDN参考链接 新建工程 第一步:project中new project 第二步:在高亮部分输入工程的地址,工程文件夹与IAR工程文件夹放在 ...
- 【以太网模块调试记录】ZLG EPORTM集成式RJ45调试记录(STM32/GD32)
ZLG(致远电子)集成式RJ45模块调试记录 集成了RJ45网络接口和PHY芯片(YT8512H) 官网链接:https://www.zlg.cn/Ethernet/Ethernet/product/ ...
- ucos ii堆栈大小检测
在使用ucos ii时经常会有疑问,这个堆栈该给多大,虽然ucos ii 自带了任务堆栈检测,但是我觉得太麻烦了,而且还会占用资源,我投机取巧的使用内存是否为0来判断堆栈是否使用过,进而检测出堆栈的最 ...
- ROS上同时预览depth,IR,RGB 调试记录
ROS上同时预览depth,IR,RGB 调试记录 用rviz同时显示RGB,IR,DEPTH(验证设备:astraprosm,canglong2,deeyea) 1.编译libuvc库 cd lib ...
- lwip协议栈在linux运行,LwIP协议栈在uCOS II下的实现
1.概述: LwIP协议栈在设计时就考虑到了将来的移植问题,因此把所有与硬件.OS.编译器相关的部份独立出来,放在ucosii&LwIPsource etlwiparch目录下.因此LwIP在 ...
- ADF4350调试记录及频点锁定
ADF4350调试记录及频点锁定 简介 宽带频率合成器,集成VCO 控制时序 调试记录 无法锁定 最开始,一直无法锁定,参考的官方例子程序,硬件外围电路也排查了好几遍,环路滤波带宽等设定,硬件软件来回 ...
- 现在考Oracle 19c OCP还需要官方的培训记录吗?
内容说明:长期以来获得Oracle OCP(Oracle Certified Professional)的认证需要参加Oracle的官方或者合作伙伴组织的培训.我的很多学员向姚远老师抱怨这数千元的培训 ...
- WK2204 - spi转uart调试记录
WK2204 - spi转uart调试记录 硬件 芯片简介 电路设计 驱动 添加设备树 添加驱动 调试 查看启动加载 检查串口通信 数据乱码或丢失 RS485只能收不能发 系统中断响应异常 思考 硬件 ...
- 在ADSP21489下外挂S29AL016J并行FLASH调试记录
我哭,调试了5天 总结下在ADSP21489下挂S29AL016J并行flash调试记录 S29AL016J:2M*8bit 21489EZ-Kite M29W320EB: 4M*8Bit 在修改fl ...
- rk3368 Android9.0 HIDL调试记录
rk3368 Android9.0 HIDL调试记录 Platform: RK3368 OS: Android 9.0 Kernel: 4.4.194 文章目录 rk3368 Android9.0 H ...
最新文章
- SpringBoot静态获取 bean的三种方式,你学会了吗?
- RedHat之yum解决办法
- Android自定义水波纹动画Layout
- 11g compression 新特性(1)
- 现代制造工程——考试复习01
- SQL Server 2008 R2 Developer Edition图文安装教程
- java接口import_深入理解Java架构师在组件注册@Import导入容器(ImportSelector接口)的神操作!...
- 网络IO模型详细分析
- 【英语学习】【Daily English】U10 Education L02 I'm not a pushy parent
- opencv复杂变换cvPyrDown [6]
- python和c先学哪个-python和c先学哪个
- 华为交换机忘记密码怎么办啊,华为交换机登陆密码忘了怎么办
- 模糊综合评价模型(下:多级)
- android 分区 加密软件,VeraCrypt(硬盘分区加密软件)
- editplus文本编辑器添加语法高亮
- 基于python的税额计算器
- 魏尔斯特拉斯---严谨的典范
- Open OnDemand部署安装使用手册
- 网传学习通1.7亿密码泄露:有什么补救措施?
- 电脑增加机械硬盘计算机管理,电脑新增加一块硬盘安装并使用的教程
热门文章
- JavaScript参考文档
- 文件md5怎么会变化
- DeepMOT: A Differentiable Framework for Training Multiple Object Trackers
- VUE 动态响应的实现
- 开关电源中输出电容的ESR会影响负载的动态响应
- 新建word文档如何删掉页眉横线
- 破解新浪微博js加密登陆超详细
- PostgreSQL 源码解读(152)- PG Tools#4(ReceiveXlogStream)
- 关于圆的角度和弧度的计算公式
- Android11(R) system_ext 分区 system_ext_specific 属性