u-boot下延时程序失效的bug调试

最近在工作中的一个项目中,大概是将两块板卡相连(一块STM32跑裸机程序,另一块AM335x跑Linux系统),但是发现在u-boot有时无法启动成功,需要通过一个GPIO的状态来判断,具体来说就是本来上电后端口默认高阻抗,先利用程序先拉低大概100ms,然后在使用程序拉高100ms,然后STM32程序检测这段电平跳变,从而确定系统正确启动,否则会进行软件复位使AM335X的单板能够正常启动,程序本身并不难,但是调试时遇到了一个奇怪的bug,简单记录下。

平台:
am335x,u-boot v2010.07,linux v3.1,arm-none-linux-gcc 2009.01
代码:
核心部分如下

//gpmc_a5(GPIO1_21=1*32+21=53):first low for 100ms,then high for 100ms
void set_gpmc_a5_level(void){
    int i = 0;  

    configure_module_pin_mux(gpmc_a5_pin_mux);
        if(gpio_request(53, "gpmc_a5") != 0) {
        printf("gpmc_a5 request failed\n);
        return;
    }
    gpio_direction_output(53, 0);
    while(1){
        gpio_set_value(53, 0);
        for (i = 0; i < 500; i++);
        gpio_set_value(53, 1);
        for (i = 0; i < 100; i++);
    }
}  

问题:
编译烧写到单板,使用示波器测量,发现这个GPIO口的占空比始终为50%,高低电平一直都是2ms左右,然后又修改了几个数字,发现依旧这样
调试:
由于程序看不出问题,示波器测得波形有问题,就考虑使用objdump对u-boot进行反汇编看看最后编译成的实际代码,然后发现无论如何修改for (i = 0; i < 500; i++);这句话里面的时间,反汇编里面的set_gpmc_a5_level延时都是0x53,示波器测得是2ms,后来考虑到u-boot可能会对代码进行优化,尝试修改了变量为volatile int i = 0;,重新测量波形,一切正常
结果:

volatile int i = 0;

由于此版本u-boot会对代码进行优化,因此需要加volatile关键字,这个关键词作用如下:这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了,因此编译器不会对这个变量进行优化,而是每次重新读取这个值

时间: 2024-10-12 08:32:38

u-boot下延时程序失效的bug调试的相关文章

360浏览器下设置按钮失效的bug无法解决

表现一:注册页面无此bug 表现二:绑定手机页面有bug 表现三:可以设置其他按钮失效 但是不能设置自身失效 表现四:只有文字区域可以点击 非按钮文字区域不能点击 解决方法:重叠一个按钮用来显示提示语 设置原本的按钮文字为空 时间过后再恢复 原本的代码 var wait=60; function time(o) { if (wait == 0) { o.removeAttribute("disabled"); o.value="获取激活码"; wait = 60;

论 BUG调试与(程序猿)初学者

作为一枚程序猿,BUG调试是最基本的技能,对于初学者更是重中之重.个人而言,要想为自己的程序猿生涯更上一层楼,就得知道什么是BUG调试,而且还必须知道怎么调好BUG.那么BUG究竟是什么呢?在我之前的一篇关于BUG的论述<朋友,请待你的朋友--BUG好一点!>已经说得很清楚了.BUG作为一类寄生于程序猿体内的"昆虫",其实它并不可怕.可怕的是,当我们捕获一只BUG时却不知怎么处理它. 1.对于HTML/CSS而言,如果页面布局出现了BUG,一般而言,这类BUG的攻击力最低.

Unix下C程序内存泄漏检测工具Valgrind安装与使用

Unix下C程序内存泄漏检测工具Valgrind安装与使用 Valgrind是一款用于内存调试.内存泄漏检测以及性能分析的软件开发工具. Valgrind的最初作者是Julian Seward,他于2006年由于在开发Valgrind上的工作获得了第二届Google-O'Reilly开源代码奖. Valgrind遵守GNU通用公共许可证条款,是一款自由软件. 官网 http://www.valgrind.org 下载与安装 #wget http://www.valgrind.org/downlo

Windows下Java程序实现对Mysql数据库的插入,删除,修改和查询

运行环境:Windows7,Eclipse,MySql,JDK1.7,mysql-connector-java-5.1.17-bin.jar 1 //import java.io.*; 2 import java.util.*; 3 import java.sql.*; 4 5 /** 6 * 7 * @date 2014-05-20 8 * @author asif 9 * @作用 java实现对mysql数据库的增减删查 10 * @bug 插入,删除,更新的时候异常停止 11 * 12 *

关于cocos2dx程序的BUG调试解决方案

今天说一下手机游戏开发的调试问题吧.不得不说的是和PC平台游戏.软件开发相比,手机上开发游戏和软件要困难的多.原因是多方面的,比如说开发环境比较复杂,工具软件不够人性化等等. cocos2dx的出现解决了一个很大的问题,因为他是跨平台的,相对来说windows的软件开发环境比较友好,对中国程序员来说更熟悉.这样可以在windows进行日常开发和调试,然后在发布到其它平台的时候进行少量的处理就好了. cocos2dx程序的调试,在windows下和端游类似,可以在后台窗口进行打印,也可以直接在vs

查看程序运行时间以及延时程序实现

头文件需要包含iostream,ctime 查看程序运行时间函数: void ViewRuntime(){ while (true) { cout << clock() << endl; if (cin.get() != 'q')//按下q键可退出 continue; else break; }} 延时程序: void Delay(float secs)//可使用默认参数{ clock_t delay = secs * CLOCKS_PER_SEC;//需要延时的时间,单位是秒 c

数据库----问题1:数据库索引底层是怎样实现的,哪些情况下索引会失效?

什么是索引: 一个索引是存储的表中一个特定列的值数据结构(最常见的是B-Tree).索引是在表的列上创建.所以,要记住的关键点是索引包含一个表中列的值,并且这些值存储在一个数据结构中.请记住记住这一点:索引是一种数据结构 . 哈希索引的缺点: 优点:在寻找值时哈希表效率极高,如果使用哈希索引,对于比较字符串是否相等的查询能够极快的检索出的值. 缺点:哈希表是无顺的数据结构,对于很多类型的查询语句哈希索引都无能为力.比如无法查询所有小于40岁的员工.因为哈希表只适合查询键值对-也就是说查询相等的查

More Effective C++ 条款32 在未来时态下发展程序

1. 所谓"在未来时态下发展程序",指的是是程序需要具有良好的可扩展性和可维护性,它要求程序:功能齐全,接口易用,代码泛化,以下原则有助于实现这一目标: 1). 以C++本身表现各种规范而不是仅仅依赖于注释:如果某个class不打算作为基类,那么就应该以C++语法阻止派生(条款26);如果一个class要求所有对象实体在heap内产生,就以C++语法严格厉行这项约束(条款27),如果copying和assignment对某个class没有意义,就声明为private... 2). 如果

SharePoint _layouts下自定义程序页面权限管理

在sharepoint中,_layouts下的自定义页面没有特别的权限,只要用户能访问sharepoint站点就可以访问_layouts下的自定义程序页面,现在我们需要给自定义页面做一下权限认证.要求如下: 1)自定义程序页面只为特定的站点服务,如图: 我们的自定义页面只为docs站点服务,只有/docs/_layouts/15/这样的访问路径才是合法的. 2)能访问docs站点的用户不一定就可以访问该页面,所以我们需要给该页面配置一个权限管理的list,如图: 3)有些自定义程序页面比较特殊,