VxWorks 最小系统移植到全志 A40i CPU 过程中的 bug 修复记录
硬件平台:英飞凌 OKA40i 开发板
软件平台:VxWorks 6.6
最小系统所需要的驱动包括:
汇编启动文件,
mmu 配置
串口,
ARM 内核通用定时器,
GIC
bug0: 串口打印字符串为错误值,经过测试,函数调用时参数传递错误。
解决:这是因为我之前设置的 tftp 下载地址为 0x41000000, 而 RAM_LOW_ADRS 宏的值为 0x41100000,
空间只有 1M,不足以装载整个操作 elf 系统镜像,当 uboot 拷贝 elf 是会破坏原 elf 文件,将 tftp 下载地址更改为 0x40b00000, 问题解决
是地址空间溢出导致的
bug1: VxWorks 启动后可以进入 usrInit(),但无法进入 usrRoot()
进入 kernelInit() 之后就再也没有输出了,而且这个函数,尼玛是不开源的,调都没法调试,cnm
测试1:在启动文件中,将中断打开,有概率(wcnm)可以进入 usrRoot().
那么为什么呢?为什么会是概率进入呢???关闭就稳定进不去 usrRoot()?
测试2:我在 usrInit() 失能 GIC,可以稳定进入 usrRoot(); cnm,什么毛病, 不过果然是中断的问题
解决:在启动文件 sysALib.s 中,直接失能 GIC,问题解决,可以进入 usrRoot().
所以应该是 uboot 配置了 gic, 在 uerKernelInit() 中重新使能中断时导致了系统跑死
bug2: 在执行完系统时钟初始化后,系统跑死。
经过测试,只要不使能时钟中断,就不会死,一使能时钟中断,就会死
那么猜测,是中断的问题,中断向量表的问题?我感觉是寻址跑飞。
测试1:打印一下中断向量表:
VxWorks 的中断向量表基地址为 0,并没有通过设置 VBAR 寄存器重映射中断向量表基地址,所以BSP 开发过程中,我们应该把 0 地址重映射到系统 RAM 地址起始处
Vectors:
address 0x00 = 0xe7fddefe
address 0x04 = 0xe59ff0f4
address 0x08 = 0xe59ff0f4
address 0x0c = 0xe59ff0f4
address 0x10 = 0xe59ff0f4
address 0x14 = 0x53c540af
address 0x18 = 0xe59ff0f4
address 0x1c = 0xdd9d9774
没有问题,0x18 为 IRQ 向量,存储的是一个跳转指令 0xe59ff000,跳转到 0xf4?
查看代码发现,VxWorks 系统内真正的向量表基地址为 0x100
向量表如下:
address 0x100 = 0x4115858c
address 0x104 = 0x411582cc
address 0x108 = 0x4115857c
address 0x10c = 0x411582f8
address 0x110 = 0xffffffff
address 0x114 = 0x4114a678
address 0x118 = 0xfff7ffff
address 0x11c = 0xffffbfff
中断向量表配置是正确的
测试2:查看是否触发中断
经过测试,系统一直在触发系统定时器中断,所以死了。
难道是时间间隔设置错了?
并不是,我在时钟中断处理函数中将重新使能定时器的接口关了,依然会有这个现象,这应该是系统与 bsp 的中断接口编写的有问题造成的。
更改适配的中断系统接口,问题依旧存在。在中断服务程序中失能对应中断,则不会一直触发中断。
测试3: 读取定时器频率
经过测试,发现定时器频率读出来是 0. 难怪一直触发 Timer 中断
**解决(暂时):**那么手动设置定时器频率为 24M。所以不是 gic 驱动的问题,妈的
待解决 bug: ARM 通用定时器频率读出来为 0
也许需要手动设置频率?
解决: 参考 《ARM 架构手册》B8.1.1 节内容,得知,需要手动设置 ARM 通用定时器的频率为 1-50 MHz。
所以是没有设置通用定时器频率造成的
bug3: 系统一直触发串口中断
是因为我在串口中直接操作 THR 发送打印,而此时串口的发送中断标志位已经被清除,当打印信息发送完成,又会触发发送中断,(PS:串口发送中断一直开着,也许应该优化驱动?)
解决: 不要调用 bspDbgMsg(), 该函数会直接写串口发送寄存器,即删除串口中断中的打印代码
bug4: usrRoot() 运行过程中触发未定义指令异常
系统打印如下:
Undefined instruction
Exception address: 0x4114d9d0
Current Processor Status Register: 0x60000113
Task: 0x4ceef6d8 “tRootTask”
0x4ceef6d8 (tRootTask): task 0x4ceef6d8 has had a failure and has been stopped.
0x4ceef6d8 (tRootTask): fatal exception in a kernel task or stack overflow !
将 usrRoot() 函数中对 C++ 的支持注释掉,可以规避该问题。
代码死在如下函数中:
cplusCtorsLink(); //这什么函数, 注释说是编译生成的?
解决: 反正也用不到 C++,直接注释掉。
VxWorks 最小系统移植到全志 A40i CPU 过程中的 bug 修复记录相关推荐
- Linux程序下载到板子上,uclinux系统移植到bf561板子上过程
uclinux系统移植 主要工作包括: 1.选择处理器对应的交叉编译器(交叉编译器,运行于通用机上,目的为了编译出能够在特定平台上运行的软件) 2.选择并修改bootloader 3.修改链接文件,定 ...
- 服务器2012还原系统,Windows Server 2012升级R2过程中意外关闭恢复原系统方法
2012升级R2过程中强制关闭了计算机,导致再次启动后蓝屏提示"BAD_SYSTEM_CONFIG_INFO".用2012安装盘进入尝试修复失败(安全模式什么的都不用想),进入命令 ...
- U盘启动器安装双系统(Win10+RHEL8.0)过程中的问题总结- 安装源出现设置基础软件仓库时出错、安装目的地中识别不出未分配的空闲空间问题、iso写入U盘做启动器的工具
前言 心有余力之际,闲暇之时,捣鼓了一下双系统,一来操作使用Linux操作系统体验感更强,熟悉性越发提高.经过一天的深入研究和大量的坑,查阅了大量的资料和教程,踩过了一个又一个深坑,经 ...
- STM32电路设计之最小系统
先点赞,再看博客,顺便点个关注鼓励一下. 如果文章看完,觉得不错的话可以点个收藏,日后不迷路. STM32电路设计之最小系统(F1) 1 前言 1.1 最小系统 1.2 参考资料 2 设计过程 2.1 ...
- 51单片机STC89C52RC进阶 – 在面包板上构建51单片机最小系统
电子元件准备 STC 89C52RC 单片机芯片(40Pin 直插式DIP封装) x 1 10uF铝电解电容 x 1 10K直插式电阻 x 2 11.0592MHz晶振 x 1 30pF瓷片电容 x ...
- Altium Designer绘制stm32最小系统PCB
Altium Designer绘制stm32最小系统PCB 一.检查原理图封装,并导入到PCB工程 二.布局 三.布线 四.覆铜 五.丝印整理 六.电气规则检查 七.添加logo 八.生成BOM和网络 ...
- 服务器安装Windows Server 2008 R2系统过程中遇到的一些坑
最近客户的一台安装了Windows Server 2008 R2操作系统的服务器老是蓝屏死机,这时候服务器的负载比较高.蓝屏代码如下: 由上图可知,蓝屏代码为0x000000c5,网上搜索大多数都说是 ...
- 全志A40I sdk wifi 模块移植说明文档
本文档编写目的是让相关人员能按照文档说明把SDK 所支持的wifi 使用起来,要使用SDK 所支持 wifi的其中一款只需要修改相关配置即可.本文档适用于android4.4 上移植 wifi 使用. ...
- 基于全志A33开发板linux系统移植学习记录(Boot0)
基于全志A33开发板linux系统移植学习记录 第一章 Boot0基于ARMGCC的编译与修改 文章目录 基于全志A33开发板linux系统移植学习记录 前言 一.全志A33简介以及上电引导流程 二. ...
最新文章
- 使用liner、feather、multiband对已经拼接的数据进行融合(下)
- 【Android应用开发】Android 蓝牙低功耗 (BLE) ( 第一篇 . 概述 . 蓝牙低功耗文档 翻译)
- 面试高频题: LRU缓存机制实现
- 每个前端开发者必会的二十个JavaScript面试题
- std:: string 的常用使用
- vuex重置所有state(可定制)
- boost::mpl模块实现is_placeholder相关的测试程序
- 存储引擎放弃使用索引的方式
- C++ Byte转十六进制字符串输出
- Standard Driver Routines(标准驱动程序)
- Linux网络设置(第二版) --互联网寻址过程
- 处理iPhone5加长屏幕的4种方法
- User-mode Linux (简体中文)
- Java调用动态库 缺点,Java调用动态库所需要关心的有关问题
- 每天一个实用小技巧!巧妙利用Mac标记,分类同类文件
- jquery手机模拟器
- 有什么方法可以将WMV格式转换成MP4格式
- 3D视频调校技术解决之道重点在3D眼镜
- Android对应颜色值代码
- 注意JDBC数据库连接中资源关闭的顺序
热门文章
- 解决Linux编译内核生成的initrd.img过大
- Linux | memtest使用的不完全总结
- iOS 6.1 evasi0n jailbreak
- 克隆虚拟机 之网络问题
- redmine备份_Bitnami Redmine备份方法
- 雷神之锤3源代码注释(1)
- macpro如何清理磁盘空间_如何清理Mac OSX 里的“其它”储存空间
- IOS,H5混合开发,setTimeout定时器失效
- 编程之路核心技术卷•Web技术内幕
- android怎么截取接口返回html代码中的内容_如何实现文本内容折叠并显示“...查看全部”?...