linux调试MCX314AL过程
以前无论用动态映射还是静态映射用串口输出和电压表测量,以为能正常读不能正常些,现在在MCX314AL加上二极管测量,使用iowrite等函数写值时二极管能有正常显示,但是一闪而过,分析原因是不是后续的程序干扰了MCX314AL的写寄存器(也许就是MCX314AL的时序不严格的坏处)。
回想前面裸跑程序当中,给MCX314AL写值之后LCD的显示程序也会对其造成干扰,会不会问题是同一个问题.
现在要做的事情:调试裸机程序,找出LCD显示程序对MCX314AL写值干扰的具体原因。
调试:1、初始化不影响MCX314AL写值
2、Paint_Bmp1和Paint_Bmp函数影响MCX314AL赋值,两种现象:
a、单步调试先写MCX314AL,再进入Paint_Bmp1函数,在该函数运行到一半是灯灭了(MCX314AL的写值改变了),Paint_Bmp1是一个给LCD显示缓冲区输入值,查看是不是缓冲区与MCX314AL的寄存器区相冲突,用串口把数组地址值输出,不冲突。
b、先运行Paint_Bmp1函数完毕,在写MCX314AL,接MCX314的LED灯一闪而过(写值不能保持)。
3、按照2中a中的现象对函数Paint_Bmp1单步调试
<pre class="objc" name="code">/****************************************************************************
函数名称:Paint_Bmp1
功能:在以x0、y0为起点坐标,h为长度,l为高度,k为缩小倍数显示bmp[]图片
参数:x0:图片起点横坐标,y0:图片起点纵坐标,h:图片高度,l:图片宽度,k:缩小倍数,bmp[]:图片像素点的C数组(16位色)
注意事项:以图片左上角为起点
*********************************************************************************/
void Paint_Bmp1(int x0,int y0,int h,int l,int k,unsigned char bmp[])//例如,k=8;意思就是将图片缩小到1/k,k可以等于2、4、8等
{
int x,y;
U32 c;
int p = 0;
h=h/k;
l=l/k;
for( y = 0 ; y < l ; y++ )
{
for( x = 0 ; x < h ; x++ )
{
c = bmp[p+1] | (bmp[p]<<8) ; //数组的两个元素拼凑成一个16位色像素点,<span style="color:#ff0000;">注:如果注销掉这一行,MCX314AL能正常写值
</span> if ( ( (x0+x) < SCR_XSIZE_TFT) && ( (y0+y) < SCR_YSIZE_TFT) ) //判断一行是否显示完毕
LCD_BUFFER[y0+y][x0+x] = c ; //赋值给显示缓冲区
p = p + 2*k; //数组偏移加2
}
p=p+480*2*(k-1); //由于缩小8倍,高和宽都每隔2*8个数组元素取两个值
}
}
<pre class="objc" name="code">/****************************************************************************
函数名称:Paint_Bmp
功能:在以x0、y0为起点坐标,h为长度,l为高度显示bmp[]图片
参数:x0:图片起点横坐标,y0:图片起点纵坐标,h:图片高度,l:图片宽度,bmp[]:图片像素点的C数组(16位色)
注意事项:以图片左上角为起点
*********************************************************************************/
/**************************************************************
在LCD屏幕上指定坐标点画一个指定大小的图片
**************************************************************/
void Paint_Bmp(int x0,int y0,int h,int l,unsigned char bmp[])
{
int x,y;
U32 c;
int p = 0;
for( y = y0 ; y < l ; y++ )
{
for( x = x0 ; x < h ; x++ )
{
c = bmp[p+1] | (bmp[p]<<8) ;
if ( ( (x0+x) < SCR_XSIZE_TFT) && ( (y0+y) < SCR_YSIZE_TFT) )
LCD_BUFFER[y0+y][x0+x] = c ;
p = p + 2 ;
}
}
}
对函数Paint_Bmp1单步调试到c = bmp[p+1] | (bmp[p]<<8) ; //注:如果注销掉这一行,MCX314AL能正常写值
程序的反汇编代码如下
对以上6条反汇编代码调试和观察寄存器变化,程序正常运行,没有跑飞,指令中没有牵涉到改变MCX314AL寄存器0x18000000-0x18000010的值,但是程序单步调试的过程当中LED灯灭了(MCX314AL寄存器有值写进去),并且LED灯每次熄灭的时间点不固定。
出现以上现象分析如下:
1、会不会是被复位了,以下是复位电路
MCX314AL的复位电路和S3C2440A公用,由按键控制(硬件控制),故排除可能;
2、电源不稳,MCX314AL的电源电路和S3C2440A公用,都为3.3V,故排除可能;
3、MCX314AL外部16M晶振电路不稳定,采用的16M有源晶振,电路图如下:
程序上单步调试无问题,硬件考虑过后,除了MCX314AL芯片本身问题,晶振输出一般不会受外界影响,但是也不能排除有影响。
3、按照2中b中的现象对 语句rMCXWR4 = 0x1234;进行单步调试,反汇编如下
rMCXWR4 = 0x1234反汇编成3条语句
LDR R0,[PC,#0114];R0的值等于0x1234
MOV R1,#0x18000000
STRH R0,[R1,#8];R0赋值给0X1800008地址空间
单步调试第三条语句过后,LED灯闪了一下又灭了(证明值是写进去了),对nGCS3的初始化在rMCXWR4 = 0x1234前面已经用串口验证过nGCS3初始化是对的,注销掉
前面的Paint_Bmp1()函数,LED能一直保持亮,故断定Paint_Bmp1()LCD显示函数(说白了就是c = bmp[p+1] | (bmp[p]<<8) ;语句)影响到MCX314AL读写,但是程序单步调试(包括看每个寄存器的值都是对的),会不会是硬件不稳定?
以上调试完成,无意中有了新情况,仔细看,发现前面用的图片基本是白色区域,也就是说图片C数组数据里面0xFF较多,将显示的图片换成白色区域较少的图片,调试MCX314AL写值正常,我的理解是0xff输出的数据全是高电平造成干扰大
将Paint_Bmp1()函数中
LCD_BUFFER[y0+y][x0+x] = c ;
这条语句改成
LCD_BUFFER[y0+y][x0+x] = 0x0000;
程序能跑正常,MCX314AL写正常;
若改成LCD_BUFFER[y0+y][x0+x] = 0x0000;
MCX314AL值受影响。
而串口起始LCD_BUFFER地址&LCD_BUFFER = 0x30880958
程序不存在问题。
总结以上分析,得出结论如下:
基本排除程序问题(但是不排除使用改变程序的方法减小干扰,这样总归是不可行的);
MCX314AL能正确读写值,但是有与读和写不一样,不需要保持数据,故读无影响,写受到数据输出的影响;
可能是nGCS3受到影响;
解决方法:
借用其他ARM9开发板试试;
重新做个晶振电路;
linux调试MCX314AL过程相关推荐
- Linux调试分析诊断利器----strace
strace是个功能强大的Linux调试分析诊断工具,可用于跟踪程序执行时进程系统调用(system call)和所接收的信号,尤其是针对源码不可读或源码无法再编译的程序. 在Linux系统中,用户程 ...
- linux 打开上一级目录,linux开机启动过程、PATH、过滤一级目录、cd的参数、ls -lrt、命令切割日志...
第二波命令正向我方来袭 :开机启动过程.PATH.过滤一级目录.cd的参数.ls -lrt.命令切割日志 1.1 linux开机启动过程 1.1.1 开机自检(BIOS)-- MBR引导-- GRUB ...
- 简述arm linux内核启动流程,Linux内核启动过程和Bootloader(总述)
1.Linux内核启动过程概述 一个嵌入式 Linux 系统从软件角度看可以分为四个部分:引导加载程序(Bootloader),Linux 内核,文件系统,应用程序.其中 Bootloader是系统启 ...
- Linux内核启动过程和Bootloader(总述)
1.Linux内核启动过程概述 一个嵌入式 Linux 系统从软件角度看可以分为四个部分:引导加载程序(Bootloader),Linux 内核,文件系统,应用程序.其中 Bootloader ...
- Linux开机启动过程(9):进入内核入口点之前最后的准备工作
内核初始化 第三部分 在原文的基础上添加了5.10.13部分的源码解读. 进入内核入口点之前最后的准备工作 这是 Linux 内核初始化过程的第三部分.在上一个部分 中我们接触到了初期中断和异常处理, ...
- Linux开机启动过程(6):页表的初始化、避开保留的内存、地址随机化
内核引导过程. Part 6. 简介 这是内核引导过程系列文章的第六部分.在前一部分,我们已经看到了内核引导过程的结尾,但是我们跳过了一些高级部分. 你可能还记得,Linux内核的入口点是 main. ...
- Linux 程序编译过程的来龙去脉
大家肯定都知道计算机程序设计语言通常分为机器语言.汇编语言和高级语言三类.高级语言需要通过翻译成机器语言才能执行,而翻译的方式分为两种,一种是编译型,另一种是解释型,因此我们基本上将高级语言分为两大类 ...
- Linux 调试之 TRACE_EVENT(三)
文章目录 前言 一.include/trace/events之外定义跟踪头文件 二.tracepoint 使用演示 三.A look inside the magic of TRACE_EVENT() ...
- VisualGDB Crack,节省调试嵌入式过程的时间
VisualGDB Crack,节省调试嵌入式过程的时间 Visual GDB 被描述为具有将 GCC.GDB 和 GNU Make 无缝集成到 Visual Studio 的能力,并且还允许用户和开 ...
最新文章
- python协程学习——写个并发获取网站标题的工具
- Socket心跳包机制
- 广文艺计算机综合美术,广东文艺职业学院2018年第二批合同制人员招聘专业技能考核和试讲题目...
- 计算机无法播放asf格式,ASF文件怎么打开播放出来?
- 基于keras实现多标签分类(multi-label classification)
- 如何在GitHub上搜索提交消息?
- android 实现类似微信缓存和即时更新好友头像
- Altium差分布线和等长方法
- Keil MDK 软件包(MDK5 Software Packs)离线下载方法
- 想做出高级又好看的PPT,这9个技巧你别错过
- 在计算机检索中 有哪些方法能缩小,使用“或OR”运算将同义词连接起来可以缩小检索。()...
- 发送网页内容到onenote_如何直接在网页上做笔记并保存到 Onenote?
- html不间断滚动图片,不间断循环滚动图片,jsp网页代码
- 告别“停车难”,条形智能停车场导视牌推动城市智能停车建设
- 基于SSH的员工信息管理系统
- 偶得李春芬先生书信一函
- 《信息物理融合系统(CPS)设计、建模与仿真——基于 Ptolemy II 平台》——2.4 注释及参数设置...
- 详解 Redis 应用场景及应用实例
- 蓝桥杯——单片机赛道
- 黑客滥用FBI邮件服务器大规模发送虚假威胁警报,不安全编码是元凶
热门文章
- Hudson插件开发入门体验
- [笔试题记录]T01 最优高铁修建方案
- 从为何“万事开头难”谈大型网站应用设计——运用冥想
- 请写下你的烦恼——读《解忧杂货店》有感
- linux设备驱动之USB数据传输分析
- ElasticSearch增删改查之python sort、scroll、scan
- Electricity and Magnetism (3rd Edition) coursehero账号 30次解锁
- WordPress免费主题JianYue如何设置和添加友情链接?
- 2021年度关键词-ICT网络基础设施建设
- 【FLACC】A Greedy Agglomerative Framework for Clustered Federated Learning