OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7193|回复: 14

升级keil mdk后使用asm后报错

[复制链接]

1

主题

6

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2018-1-19
在线时间
3 小时
发表于 2018-1-21 09:54:55 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 camdw 于 2018-1-21 09:56 编辑

__asm void SystemReset(void)
{
mov r0, #1           //;
msr faultmask, r0    //; Çå3yFAULTMASK ½ûÖ1ò»ÇDÖD¶Ï2úéú
ldr r0, =0xE000ED0C  //;
ldr r1, =0x05FA0004  //;
str r1, [r0]         //; Ïμí3èí¼t¸′λ   

deadloop
    B deadloop        //; ËàÑ-»·ê13ìDòÔËDD2»μ½ÏÂÃæμÄ′úÂë
}

这个旧版本没有警告,新版本升级后左边提示有错误x标记,提示为: error: expect '(' after 'asm'

请问怎么才能消除??  大写的__ASM也不行

最佳答案

查看完整内容[请看2#楼]

解决了,只需要__asm变成__ASM即可
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2018-6-24
在线时间
7 小时
发表于 2018-1-21 09:54:56 | 显示全部楼层
解决了,只需要__asm变成__ASM即可 无标题.png
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2018-1-19
在线时间
3 小时
 楼主| 发表于 2018-1-21 10:45:17 | 显示全部楼层
顶                 
回复

使用道具 举报

0

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
361
金钱
361
注册时间
2016-11-1
在线时间
119 小时
发表于 2018-1-21 10:53:05 | 显示全部楼层
你是不是用了v6版本的compiler,改为用v5版本的compiler吧,v6语法改了,具体参考https://developer.arm.com/docs/d ... and-operators/__asm
回复

使用道具 举报

0

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
361
金钱
361
注册时间
2016-11-1
在线时间
119 小时
发表于 2018-1-21 10:56:14 | 显示全部楼层
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2018-1-19
在线时间
3 小时
 楼主| 发表于 2018-1-21 13:14:52 | 显示全部楼层
顶,试着改了一下没成功
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2018-1-19
在线时间
3 小时
 楼主| 发表于 2018-1-21 17:37:17 | 显示全部楼层
              
回复

使用道具 举报

0

主题

88

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
361
金钱
361
注册时间
2016-11-1
在线时间
119 小时
发表于 2018-1-21 22:09:35 | 显示全部楼层
才发现在用v5 complier也报错,看来你是从keil 4.x版本升上来
建议你将汇编部分的内容移到单独的汇编文件算了,反正你那个函数内也没有C语句。
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2018-1-19
在线时间
3 小时
 楼主| 发表于 2018-1-22 13:50:35 | 显示全部楼层
Noctis 发表于 2018-1-21 22:09
才发现在用v5 complier也报错,看来你是从keil 4.x版本升上来
建议你将汇编部分的内容移到单独的汇编文 ...

确实是从4xx移植上来的!!
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2018-1-19
在线时间
3 小时
 楼主| 发表于 2018-1-23 09:50:51 | 显示全部楼层
ddddddddddddddd
回复

使用道具 举报

15

主题

406

帖子

0

精华

高级会员

Rank: 4

积分
795
金钱
795
注册时间
2015-3-26
在线时间
151 小时
发表于 2018-1-23 10:10:58 | 显示全部楼层
看下,注释的乱码是否影响了代码
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2019-11-4
在线时间
1 小时
发表于 2019-11-26 13:43:02 | 显示全部楼层
解决了吗?
回复

使用道具 举报

0

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2016-9-8
在线时间
29 小时
发表于 2019-12-1 17:41:28 | 显示全部楼层
本帖最后由 weibo78 于 2019-12-1 20:17 编辑

简单地说,可以用类似下面这种做法:
这个sys.c中的语句,把下面这段
/*__asm void MSR_MSP(uint32_t addr)
{
    MSR MSP, r0                         //set Main Stack value
    BX r14
}*/
改成标准的ASM+C格式即可
void MSR_MSP(uint32_t addr)
{
    __asm volatile("MSR MSP, r0");                         //set Main Stack value
    __asm volatile("BX r14");
}
与此相关的ASM写法,arm也给出了一个解释:
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0205g/Chdjggff.html

摘录了内容如下,
[size=1.1em]Virtual registers
Inline assembly code for the compiler always specifies virtual registers. The compiler chooses the physical registers to be used for each instruction during code-generation, and enables the compiler to optimize fully the assembly code and surrounding C or C++ code.
The pc (r15), lr (r14), and sp (r13) registers cannot be accessed at all. An error message is generated when these registers are accessed.
The initial values of virtual registers are undefined. Therefore, you must write to virtual registers before reading them. The compiler warns you if code reads a virtual register before writing to it. The compiler also generates these warnings for legacy code that relies on particular values in physical registers at the beginning of inline assembly code, for example:
int add(int i, int j) {    int res;    __asm {        ADD res, r0, r1   // relies on i passed in r0 and j passed in r1    }    return res;}
This code generates the following warning and error messages:

回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2019-5-19
在线时间
1 小时
发表于 2019-12-13 11:26:43 | 显示全部楼层
weibo78 发表于 2019-12-1 17:41
简单地说,可以用类似下面这种做法:
这个sys.c中的语句,把下面这段
/*__asm void MSR_MSP(uint32_t add ...

老铁,不行啊. 加\n也不行,  求救
  1. //__ASM void SysCtlDelay(uint32_t ulCount)
  2. //{
  3. ////    __asm("    subs    r0, #1\n"
  4. ////        "    bne.n   SysCtlDelay\n"
  5. ////        "    bx      lr");
  6. //    subs    r0, #1;
  7. //    bne     SysCtlDelay;
  8. //    bx      lr;
  9. //}

  10. void SysCtlDelay(uint32_t ulCount)
  11. {
  12.         __ASM volatile("subs    r0, #1");
  13.         __ASM volatile("bne     SysCtlDelay");
  14.         __ASM volatile("bx      lr");
  15. }
复制代码
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2018-6-24
在线时间
7 小时
发表于 2020-2-25 10:51:32 | 显示全部楼层
同样遇到这个问题,我是从5.12升级到5.14的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-20 21:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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