搜索
bottom↓
回复: 30

对于stm32,MDK下C和汇编如何混合编程?

[复制链接]

出0入0汤圆

发表于 2009-10-8 17:46:34 | 显示全部楼层 |阅读模式
对于stm32,MDK下汇编代码嵌入C的规则是什么?
我试过下面的都编译出错:
1.  _asm("nop");
2.#asm
  nop
  #endasm
3. #pragma asm
    nop
   #pragma endasm

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2009-10-8 17:55:32 | 显示全部楼层
大家关注一下吧

出0入0汤圆

 楼主| 发表于 2009-10-8 18:12:58 | 显示全部楼层
请注意,是汇编嵌入C语言文件,而后进行编译的

出0入0汤圆

 楼主| 发表于 2009-10-9 09:01:19 | 显示全部楼层
请大家支持一下

出0入0汤圆

发表于 2009-10-9 09:13:58 | 显示全部楼层
STM32只能用THUMB2,MDK下,THUMB2的指令不能直接嵌入到C中,但好像THUMB的子程序就可以。

出0入0汤圆

 楼主| 发表于 2009-10-9 10:05:39 | 显示全部楼层
“MDK下,THUMB2的指令不能直接嵌入到C中”

--->确实这样吗?我很怀疑!

出0入0汤圆

发表于 2009-10-9 10:51:57 | 显示全部楼层
RealView3.0以后可以直接用Thumb-2

出0入0汤圆

发表于 2009-10-9 11:12:39 | 显示全部楼层
__asm("指令");这种语法是内联汇编的语法。
而RMDK下,内联汇编仅支持ARM汇编语言,不支持Thumb或者Thumb-2汇编语言;但内嵌汇编器支持Thumb和Thumb-2。


楼主用的是内联汇编的做法,所以是不会被支持的。如果楼主还是很怀疑的话,就继续试验下去啦!一不小心成功的话,记得告诉大家啊!

出0入0汤圆

 楼主| 发表于 2009-10-9 12:49:06 | 显示全部楼层
谢谢大家,那么MDK3.40下,在C语言语句中到底怎样才能嵌入汇编语句?请举个例子

出0入0汤圆

发表于 2009-10-9 13:04:20 | 显示全部楼层
CM3编程C语言中加入汇编的方法:

1:新建一个ASM文件,在该文件开头加入:
        AREA  AsmTest,    CODE,   READONLY
     THUMB
     PRESERVE8
     export   MovMovtTest    ;在这里声明一个可全局引用的标号也就是该函数的名称
MovMovtTest                  ;必须顶格写,下面的就是实现其功能的具体方法啦
        push      {lr}
      ;错误的顺序
        movt       r14,        #0x5678
    mov       r14,        #0x1234
        ;正确的顺序
    mov       r14,      #0x1234
    movt      r14,      #0x5678
    pop       {PC}
    END
2:把该ASM文件添加到你的项目里去
3:在C文件中声明这个汇编的函数比如在main.c文件中声明
void MovMovtTest(void);//
然后就可以调用它了~~

http://www.daxia.com/bibis/moredata_1546507.shtml

出0入0汤圆

发表于 2009-10-9 13:33:32 | 显示全部楼层
写汇编函数,查MDK的help就知道了

出0入0汤圆

 楼主| 发表于 2009-10-9 18:54:39 | 显示全部楼层
谢谢大家

出0入0汤圆

发表于 2009-10-11 21:56:17 | 显示全部楼层
这个帖子很有意义
【10楼】 stan
这种写法有没有试过带参数的?

出0入0汤圆

发表于 2009-10-24 19:45:49 | 显示全部楼层
MARK
学习一下

出0入0汤圆

发表于 2010-6-3 22:21:46 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-7-11 16:55:01 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-8-3 13:45:44 | 显示全部楼层
core_m3.c / core_m3.h 中有汇编函数和汇编指令的使用!可以参考下,我还没来得及详细看!

出0入0汤圆

发表于 2010-8-3 14:11:43 | 显示全部楼层
支持一下,上次在SD卡读取信息的时候,就调用了汇编,不知道是什么情况

出0入9汤圆

发表于 2010-8-3 14:57:00 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-5-26 11:31:23 | 显示全部楼层
写成汇编函数的形式就可以的了 举例如下:
__asm void SystemSoftReset(void)          //软件复位 自己添加
{
MOV R0, #1           //;
MSR FAULTMASK, R0    //; 清除FAULTMASK 禁止一切中断产生 faultmask是特殊功能寄存器,不需要定义直接用 和R0一样
LDR R0, =0xE000ED0C  //;
LDR R1, =0x05FA0004  //;
STR R1, [R0]         //; 系统软件复位   

deadloop
    B deadloop        //; 死循环使程序运行不到下面的代码
}

然后需要调用的时候:SystemSoftReset();就行了哦

出0入0汤圆

发表于 2011-6-27 11:32:46 | 显示全部楼层
学习

出0入0汤圆

发表于 2012-1-3 15:08:21 | 显示全部楼层
谢谢!

出0入0汤圆

发表于 2012-1-3 15:14:15 | 显示全部楼层
mark

出0入30汤圆

发表于 2012-1-3 15:47:05 | 显示全部楼层
MARK

出0入0汤圆

发表于 2012-5-2 22:19:44 | 显示全部楼层
mark!!学习了

出0入0汤圆

发表于 2012-6-9 20:32:54 | 显示全部楼层
学习啦啊啊

出0入0汤圆

发表于 2014-9-18 11:22:01 | 显示全部楼层
今天测试IO口速度的时候试了一下, __asm("nop");  是可以用的,注意前面是两个下划线

出0入0汤圆

发表于 2015-3-6 11:53:30 | 显示全部楼层
楼主的混合编程搞好了没?

出0入0汤圆

发表于 2015-3-6 13:08:58 | 显示全部楼层
__asm
不是_asm

出0入0汤圆

发表于 2015-12-2 11:42:14 | 显示全部楼层
最近我也在纠结这个问题,试了很多方法,还是不成功
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-18 02:41

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表