硬件平台:英飞凌 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 修复记录相关推荐

  1. Linux程序下载到板子上,uclinux系统移植到bf561板子上过程

    uclinux系统移植 主要工作包括: 1.选择处理器对应的交叉编译器(交叉编译器,运行于通用机上,目的为了编译出能够在特定平台上运行的软件) 2.选择并修改bootloader 3.修改链接文件,定 ...

  2. 服务器2012还原系统,Windows Server 2012升级R2过程中意外关闭恢复原系统方法

    2012升级R2过程中强制关闭了计算机,导致再次启动后蓝屏提示"BAD_SYSTEM_CONFIG_INFO".用2012安装盘进入尝试修复失败(安全模式什么的都不用想),进入命令 ...

  3. U盘启动器安装双系统(Win10+RHEL8.0)过程中的问题总结- 安装源出现设置基础软件仓库时出错、安装目的地中识别不出未分配的空闲空间问题、iso写入U盘做启动器的工具

    前言         心有余力之际,闲暇之时,捣鼓了一下双系统,一来操作使用Linux操作系统体验感更强,熟悉性越发提高.经过一天的深入研究和大量的坑,查阅了大量的资料和教程,踩过了一个又一个深坑,经 ...

  4. STM32电路设计之最小系统

    先点赞,再看博客,顺便点个关注鼓励一下. 如果文章看完,觉得不错的话可以点个收藏,日后不迷路. STM32电路设计之最小系统(F1) 1 前言 1.1 最小系统 1.2 参考资料 2 设计过程 2.1 ...

  5. 51单片机STC89C52RC进阶 – 在面包板上构建51单片机最小系统

    电子元件准备 STC 89C52RC 单片机芯片(40Pin 直插式DIP封装) x 1 10uF铝电解电容 x 1 10K直插式电阻 x 2 11.0592MHz晶振 x 1 30pF瓷片电容 x ...

  6. Altium Designer绘制stm32最小系统PCB

    Altium Designer绘制stm32最小系统PCB 一.检查原理图封装,并导入到PCB工程 二.布局 三.布线 四.覆铜 五.丝印整理 六.电气规则检查 七.添加logo 八.生成BOM和网络 ...

  7. 服务器安装Windows Server 2008 R2系统过程中遇到的一些坑

    最近客户的一台安装了Windows Server 2008 R2操作系统的服务器老是蓝屏死机,这时候服务器的负载比较高.蓝屏代码如下: 由上图可知,蓝屏代码为0x000000c5,网上搜索大多数都说是 ...

  8. 全志A40I sdk wifi 模块移植说明文档

    本文档编写目的是让相关人员能按照文档说明把SDK 所支持的wifi 使用起来,要使用SDK 所支持 wifi的其中一款只需要修改相关配置即可.本文档适用于android4.4 上移植 wifi 使用. ...

  9. 基于全志A33开发板linux系统移植学习记录(Boot0)

    基于全志A33开发板linux系统移植学习记录 第一章 Boot0基于ARMGCC的编译与修改 文章目录 基于全志A33开发板linux系统移植学习记录 前言 一.全志A33简介以及上电引导流程 二. ...

最新文章

  1. 使用liner、feather、multiband对已经拼接的数据进行融合(下)
  2. 【Android应用开发】Android 蓝牙低功耗 (BLE) ( 第一篇 . 概述 . 蓝牙低功耗文档 翻译)
  3. 面试高频题: LRU缓存机制实现
  4. 每个前端开发者必会的二十个JavaScript面试题
  5. std:: string 的常用使用
  6. vuex重置所有state(可定制)
  7. boost::mpl模块实现is_placeholder相关的测试程序
  8. 存储引擎放弃使用索引的方式
  9. C++ Byte转十六进制字符串输出
  10. Standard Driver Routines(标准驱动程序)
  11. Linux网络设置(第二版) --互联网寻址过程
  12. 处理iPhone5加长屏幕的4种方法
  13. User-mode Linux (简体中文)
  14. Java调用动态库 缺点,Java调用动态库所需要关心的有关问题
  15. 每天一个实用小技巧!巧妙利用Mac标记,分类同类文件
  16. jquery手机模拟器
  17. 有什么方法可以将WMV格式转换成MP4格式
  18. 3D视频调校技术解决之道重点在3D眼镜
  19. Android对应颜色值代码
  20. 注意JDBC数据库连接中资源关闭的顺序

热门文章

  1. 解决Linux编译内核生成的initrd.img过大
  2. Linux | memtest使用的不完全总结
  3. iOS 6.1 evasi0n jailbreak
  4. 克隆虚拟机 之网络问题
  5. redmine备份_Bitnami Redmine备份方法
  6. 雷神之锤3源代码注释(1)
  7. macpro如何清理磁盘空间_如何清理Mac OSX 里的“其它”储存空间
  8. IOS,H5混合开发,setTimeout定时器失效
  9. 编程之路核心技术卷•Web技术内幕
  10. android怎么截取接口返回html代码中的内容_如何实现文本内容折叠并显示“...查看全部”?...