automation

    1. 电源纹波问题? 2/4618 模拟电子 2008-09-03
      在100khz下面是没有影响的 1mhz的采集频率 我没做过 帮不上忙 不好意思
    2. 呵呵 不错 只是国产plc在应用方面性能还是不是很好 但是 希望继续努力 继续超前发展
    3. ARM7上可以移植Linux吗? 7/6531 Linux与安卓 2008-08-22
      呵呵 使用uclinux 其实跑跑ucos也不错
    4. 电子工程师的宿命 10/5945 单片机 2008-08-22
      呵呵 对于电子行业 只有无止境的需求才能有更高的追求
    5. 开发都需要学习哪些软件 6/5231 嵌入式系统 2008-08-22
      谢谢分享 很多都是不错的 建议大家好好看看
    6. 大家帮助解决关于GPS漂移问题解决方法! 7/5849 嵌入式系统 2008-08-22
      以前看到过有篇gps的白皮书 那本书还是不错的 建议楼主看看
    7. 基于PIC18F系列单片机的嵌入式系统设计 2/4819 Microchip MCU 2008-08-22
      不错 很好的帖子
    8. 应届生的尴尬与无奈 18/10309 工作这点儿事 2008-07-28
      我面试过好多应届生 女孩子 有的还是不错的 男孩子很多很差劲 其中还有我的老乡 啥问题一问三不知 我对他们的评价是: 大学生=泡妞+吃饭+睡觉 猪=吃饭+睡觉 看出来 只要猪会泡妞了 就是大学生了
    9. 那位高手帮帮忙!windows ce 1/3965 嵌入式系统 2008-07-24
      我没有用过ce 不清楚 一般使用 evb或者evc来做吧
    10. 野心,成功的第一个条件 3/3414 聊聊、笑笑、闹闹 2008-07-24
      野心是成功的根本源泉 你可以也有心去做自己的事情 一个人一旦有了野心 你就会执着走下去 你就会成功了
    11. 心灵的纯度 14/6582 聊聊、笑笑、闹闹 2008-07-24
      成功就是一面不是很清晰的镜子 你只有不断地朝她微笑 不断向她靠近 永不放弃 你就会发现:成功已经开始对你微笑了
    12. 心灵的纯度 14/6582 聊聊、笑笑、闹闹 2008-07-24
      一个合格的现代商人靠的是敏锐的嗅觉 胆大的情商 不怕失败的决心
    13. 龙芯,为你祝福 3/4638 FPGA/CPLD 2008-07-24
      龙芯也只能先走政府的道路 如果奥运会都不用龙芯的ic的产品 我不知道政府所谓的支持和鼓励是什么 老百姓还会有购买的欲望么 在中国现在 适用才是硬道理
    14. ARM软件模拟硬件环境软件 2/4208 ARM技术 2008-07-24
      现在arm9的板子很多都是只要1k以下的 你去看看
    15. 心灵的纯度 14/6582 聊聊、笑笑、闹闹 2008-07-24
      人的成功最主要的是来自自身的意志力 而不是靠天赋
    16. 美国人设计的555电路分析 6/5818 模拟电子 2008-07-23
      呵呵 一楼的朋友 请你仔细看看 555的基础知识 你就会明白了 既然你坚信 美国人比中国人强 请你请教你的美国人吧 我不愿意回答你的问题 膝盖是不用跪在地上了 难道思想上面就可以跪在地上么 请你向论坛所有的人道歉
    17. 50岁老工程师的创业梦! 41/23422 电源技术 2008-07-22
      我现在在深圳出差 等我回去后和您联系
    18. .c文件和.asm文件怎么连接起来? 7/21898 单片机 2008-07-22
      我找到了一些资料 希望对你有用 下周就要做实验了,由于听老师说机房位子可能比较少,对我这种蹭课的学生来说也就不敢奢望同选这门课的同学一样能够正常的在机房调试程序了,因此,我决定提前先在自己的工作室里把实验内容给过一遍。第一个实验是关于嵌入式编程的,这个实验目的一方面是为了让我们熟悉ARM下编程的编译环境ADS和调试器ATX,另一方面是让我们掌握如何将c语言和汇编语言在实际编程中相互调用。经过这两天靠自己不断的摸索,终于掌握了如何在编译环境中进行ARM编程,另外,还学会了在c中调用汇编程序的方法,以及如何通过linux自带的gcc编译嵌有汇编的c程序,总之,收获还是蛮多的哦,下面就总结一下吧。 1、c嵌汇编 首先说一下关于GCC编译嵌有汇编语言的c语言吧,GCC编译的汇编语言不是我们上课时学的Intel x86汇编,而是AT&T汇编,两者的区别可以查看《Gcc使用的内嵌汇编语法格式小教程》。 下面是内嵌汇编的几种格式: 语法 __asm__(“instruction          . ……             instruction”);   //Linux gcc中支持(注意asm的下划线均为两个否则GCC将会无法编译) __asm{        instruction …     instruction       };       //ADS中支持(注意asm的下划线均为两个否则GCC将会无法编译) asm(“instruction [; instruction]”);   //ARM C++中使用    例1是我在linux环境下,编的嵌有汇编程序的c语言,并通过了GCC的编译: 例1: #include int plus(int a,int b) { __asm__               (               “add %1,%0\n\t”:”+r”(a):”r”(b)               ); return (c); } int main() {int a,b,c; a=2; b=1; c=plus(a,b); printf(“c=%d\n”,c); } 这个程序应该是很简单的,但关键是子函数中嵌入的那段汇编程序,具体的写法可以参看其他文章。 例2同样是c语言中嵌入了汇编,与例1不同的是,这个程序的编译环境为ADS。 例2 #include void  my_strcpy(char* src, const char* dst){          int ch;          __asm{ loop:        LDRB    ch, [src], #1        STRB   ch, [dst], #1        CMP      ch, #0        BNE      loop         }; } int main(void){     const char* a = "Hello World!";     char   b[20];     __asm{        MOV     R0, a        MOV     R1, b        BL     my_strcpy, {R0, R1}     };     printf("Original String: %s\n",a);     printf("Copied String: %s\n",b);     return 0; } 一定要注意例1与例2中汇编语言的语法格式。 2、C语言调用汇编 再说一下如何将一个c语言文件与一个汇编文件通过ADS环境编译,并通过ATX进行DEBUG调试的。先看一下下面的例3 例3 Cfile.c #include extern void strcopy(char *d, const char *s); int main() {       const char *srcstr = "abcde";         char dststr[32];         /* dststr is an array since we're going to change it */         printf("Before copying:\n");         printf("  '%s'\n  '%s'\n",srcstr,dststr);         strcopy(dststr,srcstr);         printf("After copying:\n");         printf("  '%s'\n  '%s'\n",srcstr,dststr);         return 0; } Asmfile.s AREA    SCopy, CODE, READONLY         EXPORT strcopy strcopy                          ; r0 points to destination string         ; r1 points to source string         LDRB    r2, [r1],#1     ; load byte and update address         STRB    r2, [r0],#1     ; store byte and update address;         CMP     r2, #0          ; check for zero terminator         BNE     strcopy         ; keep going if not         MOV     pc,lr           ; Return         END            ;注意!!汇编代码编写时一定要缩进,否则编译将会出错 这是一个c语言调用汇编的例子,功能是为了实现字符串的拷贝,其中汇编文件为字符串拷贝的功能子函数。在这里需要说明的是c语言调用汇编语言的一些基本规则,首先是参数传递的规则,c语言的函数前4个参数通过R0-R3来传递,其它参数通过堆栈(FD)传递,且这种传递是单项的,即汇编语言中的R0-R3的值不会再回传给c语言。拿例3举例来说,当在语言中调用strcopy(dststr,srcstr);时,字符串dststr的首地址将会传给r0,srcstr的首地址将会传给r1,当汇编语言拿到这两个寄存器时,就会通过地址依次加1的形式进行地址内容的复制也就是字符串的复制,当复制到最后一个字母e时,通过比较r2寄存器中的值是否为0来判断是否调出汇编程序(因为在c语言中声明字符串时末尾被自动的添加了一个\0),这里需要注意的是,此时寄存器r0的值为指向源字符串末尾的’\0’的地址值,而寄存器r1的值为指向已经拷贝过的目的字符串中的”e”的地址值,当调出汇编程序时,r0,r1这两个值将不会回传给strcopy(dststr,srcstr);中的两个参数dststr和srcstr,这两个参数的值仍然是c语言在初始化这两个字符串时指向字符串的首地址,这一点可以通过ATX调试时观察寄存器的变化情况来证明。但是为什么地址值没有变化,但却实现了字符串的拷贝了呢?这主要时因为通过汇编程序,虽然没有改变两个指针的位置,但却改变了两个字符串所在内存地址中的内容,这种方式就是c语言中常说的引用方式,即dststr和r0起初指向的是同一内存空间,但是字符串复制时只是利用r0来复制的,而dststr的位置却没有发生变化。因此在c语言中输出字符串时并不需要将dststr减去字符串的个数来实现指向字符串的首地址。 这个程序中第二个需要注意的地方是,汇编程序段中的起到临时存放字符串的r2寄存器,很奇怪的是这个地方的寄存器不能换成r4,如果换成r4的话,输出的结果就会有问题,这一点我现在还没有找到答案,希望将来某一天能遇见高人给我指点一下。 最后需要注意的地方是在汇编程序末尾一定要加上MOV  pc, lr 用ADS编译后,两个文件会被自动的链接,并在工程文件夹下生成一个.o文件,这个文件就是将来要下到开发板上的二进制文件,其中还有一个.axf的镜像文件,这个文件是用来进行ATX调试的,默认的单步调试是在反汇编中进行的,这就会给调试程序带来极大的不便,通过自己的摸索,发现可以通过设置strong source实现在c语言中进行单步调试,两外在单步调试中通过watch来观察c语言中的形参的值和地址的变化情况,便于程序的调试,需要强调的一点时,汇编程序与c程序的文件名不能相同,否则将无法用ATX进行调试。 另外,在汇编程序中访问c程序全局变量的例子。程序中变量globvl是在c程序中声明的全局变量。在汇编程序中首先用IMPORT伪操作声明该变量;再将其内存地址读入到寄存器R1中;再将其值读入到寄存器R0中;修改后再将寄存器R0的值赋于变量globvl。请参看例4 例4 #include int  globvl; int main(){ globvl = 0;     asmsub();    printf(“globvl = %d”, globvl);      return 0; } AREA  globals, CODE, READONLY        EXPORT asmsub        IMPORT globvl        asmsub        LDR  r1,  =globvl        LDR  r0, [r1]        ADD  r0, r0, #2        STR  r0, [r1]        MOV  pc, lr        END                ;注意!!汇编代码编写时一定要缩进,否则编译将会出错     3、汇编调用c 最后我再谈一下如何在汇编中调用c,看一下例5 例5 int g(int a, int b, int c, int d, int e) { return a + b + c + d + e; } ;汇编程序调用c程序g()计算5个整数i, 2*i, 3*i, 4*i, 5*i的和 EXPORT f AREA  f, CODE, READONLY IMPORT  g                 ;使用伪操作数IMPORT声明c程序g() STR  lr, [sp,#-4]!        ;保存返回地址 ADD  r1, r0, r0             ;假设进入程序f时,r0中的值为i,r1值设为2*i ADD  r2, r1, r0             ;r2的值设为3*i ADD  r3, r1, r2           ;r3的值设为5*i STR  r3, [sp, # -4]!     ;第五个参数5*i通过数据栈传递 ADD  r3, r1, r1           ;r4值设为4*i BL   g          ;调用c程序g() ADD  sp, sp, #4          ;调整数据栈指针,准备返回 LDR  pc, [sp], #4       ;返回 END                 ;注意!!汇编代码编写时一定要缩进,否则编译将会出错 注意,c语言最终返回的五个数之和放到了r0寄存器中
    19. .c文件和.asm文件怎么连接起来? 7/21898 单片机 2008-07-22
      好像有个ASM嵌入c的格式的 我找找
    20. 给大家一个GL850A的USB HUB的图 71/38830 单片机 2008-07-18
      呵呵 谢谢 看看再说

最近访客

< 1/1 >

统计信息

已有162人来访过

  • 芯积分:--
  • 好友:--
  • 主题:7
  • 回复:225

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言