0

关于投票
ARM程序由于字节对齐引起的问题深入分析

      首先说说,什么叫对齐。如果一个数据是从偶地址开始的连续存储,那么它就是半字对齐,否则就是非半字对齐;半字对齐的特征是bit0=0,其他位为任意值。字对齐的特征是bit1=0,bit0=1,其他位为任意值。如果一个数据是以能被4 整除的地址开始的连续存储,那么它就是字对齐,否则就是非字对齐。举例说明四字节对齐: 对内存进行操作时,被访问的地址必须为4的倍数。如果分配到的地址的地址不是4的倍数时,CPU实际访问的地址还是按照字对齐的方式来操作。也就是自动屏蔽bit1和bit0.   

      用ADS的ARM C Complier下Optimization Level可能引起问题,其中的一个问题就是字节对齐的问题。下面讲讲问题的现象及实质。

       当时问题的现象是:程序使用一公共变量Buf创建队列,如果ADS编译优化选项采用Minium则软件工作正常;源码不变,如果采用ALL优化,则不正常,数据紊乱且无法工作。为了发现问题,我们分别用Minium和ALL编译,在反汇编条件下单步跟踪程序,观察CPU寄存器和内存变量的变化情况。发现在Minium模式下,编译器把队列内存块Uart0TxBuf分配到的地址是0x400015cc,这个地址是一个4字节对齐的地址,而在ALL模式下,编译器把Buf分配的地址是0x400015c2,这个地址是一个非4字节对齐的地址。正是由于这个非4字节对齐的地址导致了问题的发生。
问题发生在QueueCreate(void *Buf, uint32 SizeOfBuf, uint8 (* ReadEmpty)(), uint8 (* WriteFull)())这个函数里,问题是如何发生的,


        在了解问题发生的机理前,先了解QueueCreate这个函数的工作原理。QueueCreate工作原理是,首先把buf指向的内存初始化为DataQueue格式的结构体。  DataQueue的结构体格式如下:
typedef struct {
    QUEUE_DATA_TYPE     *Out;                   /* 指向数据输出位置         */
    QUEUE_DATA_TYPE     *In;                    /* 指向数据输入位置         */
    QUEUE_DATA_TYPE     *End;                   /* 指向Buf的结束位置        */
    uint16              NData;                  /* 队列中数据个数           */
    uint16              MaxData;                /* 队列中允许存储的数据个数 */
   
    uint8               (* ReadEmpty)();        /* 读空处理函数             */
    uint8               (* WriteFull)();        /* 写满处理函数             */
    QUEUE_DATA_TYPE     *Buf;                 /* 存储数据的空间           */
} DataQueue;
从结构体可以看出,结构体字节类型在内存分配为: 4字节指针变量(*Out)、4字节指针变量(*In)、4字节指针变量(*End)、2字节变量NData、2字节变量MaxData、4字节函数指针变量ReadEmpty()、4字节函数指针变量(WriteFull())
   观察结构体起始地址放在非对齐时会出现什么情况。

          起始地址为0x400015c2时的由编译器分配得到的地址         实际操作地址
*Out       0x400015c2~0x400015c5                                                0x40015c0~0x400015c3
*In         0x400014c6~0x400015c9                                                 x400014c4~0x400015c7
*End      0x400015ca~0x400015cd                                               0x400015c8~0x400015cb
从表中可以看出,实际操作的地址按照4字节对齐格式得到。例如,当执行*Out进行操作时,自动屏蔽bit1和bit0,因此实际发生变化的是0x40015c0~0x400015c3,而不是0x400015c2~0x400015c5,由于实际操作地址和编译器分配地址互相覆盖,当对*In操作时,会导致*Out一起变化,对*End操作时,*In也跟着变化。正是由于非对齐的原因导致创建队列和对列操作完全错误。
     当内存起始地址为4字节对齐地址的情况时,编译器分配地址和实际地址一致,因此不存在上述问题。

结 论:

          在ARM嵌入式系统中,当把一个内存区域初始化为某个结构体时,必须注意字节对齐的情况。如果该内存起始地址为非对齐地址,不仅得不到预期的结果,还可能导致一些很奇怪的让人无法理解表面问题。在C层面上不太容易观察到这些问题的实质,只有深入到汇编一层去分析程序,才可能理解这些现象的深层原因。

 


 

系统分类: ARM
用户分类: 技术感悟
标签: ARM 字节对齐 问题
来源: 原创
发表评论 阅读全文(1320) | 回复(0)

0

关于投票
慎用ADS编译优化(示例)

在使用ADS开发软件过程中发现,当程序复杂到一定程度时,在优化选项为MINIUM时可以通过测试的程序如果用最高优化级别ALL来编译,会冒出一些莫名其妙的问题,在调试时程序在调试窗口的反汇编代码与内存窗口的反汇编代码不一致。

下面是一个例子。本意是把0x00fc00的地址作赋给函数指针upd,在优化选项为minium时,通过反汇编可以看到赋值结果是正确的。当优化选项为ALL时,赋值结果不正确,实际赋值给函数指针upd的地址是0x000000fc,而不是0x0000fc00.

点击看大图

 

系统分类: ARM
用户分类: 技术感悟
标签: ADS 编译优化 问题
来源: 原创
发表评论 阅读全文(847) | 回复(2)

0

关于投票
如何提高触摸屏点击时准确性
由于触摸屏是有两个面积很大的金属膜组成,相当于一个大电容,也相当于一个天线,很容易接收外界
干扰,因此在设计电路时需要考虑如何降低这些干扰的影响。特别是当采用CCFL作为背光源时,这些干扰尤为明显。
可以采取以下 措施减少干扰:
(1)硬件滤波,可以采用RC滤波。
(2)软件滤波,可以采取采样多次平均
(3)LCD的金属外壳接地。
系统分类: 单片机
用户分类: 技术感悟
标签: 触摸屏 干扰 CCFL
来源: 原创
发表评论 阅读全文(701) | 回复(0)

2

关于投票
本博客即将开通生物医学电子技术专栏

本人从事的工作即为生物医学电子技术研发工作。曾在某公司任职高级技术经理、项目经理。。。。

本人将逐步在博客介绍一些生物医学电子技术,可能包括以下技术:

生命体征测量领域:无创血氧测量技术,测量血液中氧气含量的技术。

                                    无创血压测量技术,测量血压,电子血压计大家都见过,就不介绍了。

                                    心电测量技术,做过体检的人都知道,体检要做心电图。

                                    。。。。

                                    医学传感器技术

                                   

系统分类: 模拟技术
用户分类: 技术感悟
标签: 生物医学 血氧测量技术 血压测量技术
来源: 原创
发表评论 阅读全文(804) | 回复(1)

1

关于投票
正确对待测试在产品设计中的作用

    测试的目的是为了验证设计结果是否达到了预期,而不是为了获得设计输出结果。然而,有些工程师在设计的过程中本末倒置,用测试的方法来获得设计结果。表现是:拍拍脑袋,得到一种设计方案,然后就找来若干器件,用面包板飞线搭建电路,然后通电测量输出,如果在预期范围内,就认为这个设计是成功的然后就以此作为产品设计。我认为这种方法可以用于验证设计原理是否正确,但是否可以采用实验中用到的器件、参数用到产品中,则值得考虑。如果要用这个方案来设计产品,在详细设计过程中,必须对电路的方案、用到的参数从理论上进行详细的分析、计算、论证。器件在选型过程中,必须结合设计方案详细阅读器件手册,必须理解每一个参数的含义,以及参数的范围是否能满足产品在各个环境下的需求。即使对于非常常用的器件都应该去读读DATASHEET,判断是否能满足设计需求。

      我个人的体会是,要想一看就能明白DATASHEET中每个参数的含义,需要很深的功底,对工程师的基础知识要求很高,我的做法是要经常回去阅读《模拟电路》、《数字电路》中最基础部分,您会发现,即使再先进的芯片,有了这些基础知识,理解起来就比较容易,这一点对模拟电路设计工程师尤为重要!
       因此,我认为,一个可靠的设计,一定要建立在理论的基础上,否则就要靠运气了。
      一个质量可靠的产品是设计出来的,而不是测试出来的。

系统分类: 模拟技术
用户分类: 技术感悟
标签: 测试 模拟电路 数字电路 心得
来源: 原创
发表评论 阅读全文(701) | 回复(0)

2

关于投票
大话专利

我对专利的看法

http://www.ednchina.com/blog/cllzs  原创)

       专利,在不了解专利的人看来,好象很神秘。正是因为很多人对专利不了解,认为专利就代表高科技,因此国内的商家就喜欢用专利来忽悠国人。如最近的闹的比较热的“获得获聘美国名企高管女生吴莹莹”事件,媒体就拿她拥有三项专利来说事,作为证明这个女孩有多聪明的证据。还有,很多商家,在宣传公司或产品的时候,喜欢把获得了多少项专利作为噱头来宣传,国外则少见。这里,我就不举例了,看看电视,读读报纸就知道这样的例子比比皆是。

       在这里,我谈谈我对专利的看法。  在我看来,写专利, 很简单。我本人只用两个星期的业余时间,就为公司贡献了两个发明专利,注意 这不是实用新型专利,这两种专利是有区别的。实用新型专利更简单,只要你写的专利文件格式符合要求,专利局不会去对使用新型专利做实质性审查,一般都可以通过,一年内拿到证书。至于你的发明有多大程度上符合三性:新颖性、创造性、实用性,取决于你的专利写作水平!而发明专利则不同,这必须严格的符合三性.按规定,专利局必须对发明专利做实质性审查, 所谓实质性审查,就是说,专利局的那帮人会根据你的专利内容,做查新工作,比如在世界范围内的专利数据库中查找是否有相同的发明,或者在各专业杂志上有否有相同技术的介绍等等,利用各种技术手段判断该东东是否真的有创新的.至于新颖性,实用性,一般都可以符合.所以,获得发明专利稍微难一点,周期也长,费用也高.  一般一年多后才给以公告,公告若干年后,若是没人提出反对意见,专利局才给你发证书. 当然,发明专利的好处是:相对不容易被人否定掉。如果你去告别人,采取倒置举证,这是针对谁主张,谁举证而言的。也就是说,如果我告你利用了我专利中的技术来生产产品,那么你就要拿出证据来证明自己没有盗用我的技术,你就必须用可靠证据证明你用了另一种方法也可以达到这个效果。当然啦,规矩说是这么说,获得专利的关键还是在文字技巧上,至于为什么,我后面慢慢解释.


       正如我前面所说的,能否获得专利,很大程度上取决于专利写作水平。在我看来,就是在玩文字游戏!为什么这么说。因为,现在的科技水平已经达到了相当高的高度,微观科技的达到了粒子水平,宏观科技可以到达火星。现在不可能像爱迪生时代那样,可以有那么多“前无古人”的技术可供开发,比如爱迪生发明的留声机。可以打个比喻:地球上已经几乎没有技术处女地了。单凭个人和简单的技术手想搞出“前无古人”的技术,比较困难。但这并不能代表人类的创新已经停止。我们可以在前人的基础上,把技术稍加改进,也是创新的表现。逐步积累,就可以推动技术逐渐向前发展。只要你能在现有技术基础上,有一点点改进,你就可以把这点东西提炼出来,配以“花言巧语”,把这点创新有限“放大”,就可以申请专利了。因为一个事物都有很多个面, 比如说, 人们以前一直只知道某样东西的某个角度情况,没有人或者说很少人知道其他角度的情况,突然有一天,你发现了从另一个角度来看这个东西的时候,有不同的感觉,这时候你就可以把这个新的看法提炼出来,就变成新的东西了。


       这里,我略举一例。筷子,大家都会用吧,在这里我贡献几个针对筷子专利(我没有去查是否真的有这样的专利):  在筷子上做上锯齿: 创新点是既可以用来切割肉,也可以用来夹菜.     把筷子做得奇形怪状,使之具有艺术效果,可以申请外观专利.  可伸缩的筷子,  弯形的筷子,满足某些人士需要
  ....  等等.
     只要你能想得出,经过某种修改后,能满足某种需求且之前并无同类技术. 就可以算创新.也就是说,你的创新性表现是: 针对某一领域内某一问题,你的解决方案是最新最好的。否则,可能沦为"显而易见的技术",也就是说,你的解决方案在该领域内,你的技术方案属于创新,你把这个东西放到别的地方,可能就不是创新了. 至于如何让专利局的专家相信你,授予你专利,全靠你的专利写作水平了.一般情况,在专利文件中结合技术背景,用对比,分析等方法论证你的技术方案在解决某领域内的某问题就是最好的.

       现在谈谈我对个人申请申请专利和企业申请专利的看法。有些人士就是企图依靠专利来发家致富,我认为在国内这是不切实际的想法.理由正如我前面所讲的意思,即搞专利不难. 即时你搞出来了,要产业化后才会创造出价值. 由于国人的习惯和知识产权保护力度的原因,国内企业一般不喜欢花大价钱去买专利.如果专利没有变成钱,每年还得给专利局交若干保护费.   因此我认为,依靠搞发明,搞专利,然后再卖专利来赚钱比较困难, 当然如果有好的创意, 自己来生产,也许能赚点钱. 但很快就有人仿制你的东西了.所以,我觉得,个人专利更适用于评职称或表现个人能力.也就是说,玩玩还可以,想靠这个发家致富,比较难,  当然我不否认也有靠这个发家致富的例子.


       专利对于企业则不同, 如果你的产品真的具有创新性,那么你一定要去申请专利. 花不了多少钱,有了专利之后可以有两种用途: 第一,如果有完全仿冒之产品,可以用这个去告别人.第二, 可以作为别人告你时反击的工具.一个公司,不仅要有真金白银的有技术含量的专利,更需要一大堆看起来有创新性的"垃圾专利".这可是企业打知识产权官司时自我保护的法宝.  下面谈谈垃圾专利.


      如果把我前面讲到的针对筷子的创新拿去申请专利, 如果获得了专利,那么就是传说中的"垃圾专利", 所谓垃圾专利,如果只看专利文件,你会觉得它讲的条条是道,感觉确实是个发明,实际上,这东西含金量不高.但这个专利完全符合授予专利的相关法律法规的,因此它是可以被授予专利的,是受法律保护的. 事实上, 国际上的大公司都深谙此道,在一个核心专利周围大量制造垃圾专利, 然后,利用这些垃圾专利到发展中国家,收取专利费. 我国企业深受其害. DVD专利就是一例. DVD专利联盟凭借1万多项有关DVD方面的专利向我国DVD企业收取专利费的,在这这1万多项专利中,有90%是垃圾专利.
那么,大企业为什么热衷于制造"垃圾专利",原因是,一方面如前面所讲,在科技这么发达的今天要搞出一个开天辟地技术的非常难,也很少. 另外一方面,就是"技术圈地".  "圈地运动"想必大家都听过. 这里的"圈地",就是用专利来占领技术地盘. 如果你的专利具有高度的专有性,那么你就占领这个技术地盘,依靠法律,收取授权费吃饭.比如ARM公司就是这么搞的.   光有核心专利, 占的地盘太小,对别人的威胁还不够大,因为别人可以在这个基础上衍生出外围专利,当外围专利足够多时,甚至可以和你共享核心专利,这就是传说中的"农村包围城市".因此为了保护核心专利,有实力的公司在这个技术上发展出大量的垃圾专利.用一句话来归纳,就是"如果你没有那么多真金白银来占领那么多地方,那么你就把垃圾堆在那里,也可以占领不少地盘",  或者说,一个大哥下面发展出很多手下。这些垃圾是受法律保护的.   垃圾专利专利在大公司知识产权对决时,非常有好处.这时,两家公司往往会互相否定对方的专利权, 最终的结果往往是和解.因为否定一个垃圾专利是容易的, 但如果要否定一堆垃圾专利, 付出的成本可能会非常高. 公司间的圾专利一般是你中有我,我中有你,最后谁也告不倒谁,钱都给律师了,只好和解。所以也可以这么说,垃圾专利也是武器,既可攻也可守,如果你的手中没有专利,当别人拿起一个垃圾专利当砖头扔过来,你手中没有武器,就只有挨揍的份!有就可以对打,看谁的专利弹药多!
        写专利并不难,其实就是"八股文".专利一般包括权利要求,技术背景,技术讲解,相关图表等等.到网上也以下到很多专利范文.呵呵, 我以本文为例写个简单的专利权利要求:
       "权利1 :这是一篇xxx写的文章, 特征是有第1段,第2段,第3段
        权利2:  如权利1说述,第1段特征是:该段包含若干个字。
       权利3: 如权利1所述,第2段特征是:该段包含xxx字眼。
       权利4: 如权利2所述 ,xx字之间有两个空格,N个句号,N个逗号
       权利5: 如权利4所述,特征是xxxx句号之后是逗号,xxx逗号之后是句号。。。。。
        。。。。。。

     然后再配上技术背景,图纸,技术说明等外围资料,按照专利局提供的文件模版填写,一篇专利就初步完成了。 总之,权利要求最好写成层层分解的过程。这样写的好处是,当别人否定一条是,你还有其他条来保护,除非他把你所有都否定了。那你就死无葬身之地啦。全部否定一般比较难,打官司卖的就是嘴皮子!

        现在谈谈国内外专利的特点:
        由于工作的原因,阅读了不少国内外的专利,感觉国内外整体水平上是有差别的. 一般说来,发达国家如美国的专利都写的既宽泛有严密,而且非常的详细,甚至连某些技术细节都讲的很清楚,好像一点都不担心别人COPY它的技术,我想这和美国知识产权保护力度有关.因此,他们的专利文献一般比较长,有三四十页.他们专利有些写的有点霸道,举个例子.
        比如, 美国有个产品,用到利用光作为探测源检测某成分的技术,在专利里描述的是“一束能量xxx透过xxx被测物体, 。。。,该能量在产品中的一个用例是XXX波长的光束” ,你想想,能量的覆盖多广啊,可以覆盖到声波或者其他形式的能量束。 而国内专利往往写的简单,虽然能讲到核心的东西,但是没有那么细致。个人专利一般就五六页,而大公司如华为的专利已经和国际接轨了。

  今天就写这么多。
  最后声明:本人非专业专利人士,文中对专利的解释不够准确甚至有误,如有人以此作为行事之指导或导致任何错误,发生任何问题都与本人无关,特此声明!!
(说明:这句话是我在对本文做“风险分析”后想到要添加的一句话,这句话涉及“法律法规风险”。“风险分析”是产品设计过程中的一个重要环节,里面很多东西可以讲,以后有空愿意和大家一起探讨)

http://www.ednchina.com/blog/cllzs  原创)

系统分类: 自由话题
用户分类: 技术感悟
标签: 专利杂谈
来源: 原创
发表评论 阅读全文(740) | 回复(0)
总共 , 当前 /