keil开发软件的使用

 

4.2使用keil创建新的arm工程步骤

 

  1. 点击project,new uvision project,新建一个文件夹,进入文件夹,选中文件夹,在文件名项输入文件名,确认。
  2. 选择芯片,在CPU栏目中找到要使用的如赠送的芯片资料,选择芯片的厂商和芯片型号,确认,系统提示是否导入启动文件,选择否
  3. 新建文件,保存为*.s汇编文件,然后右击项目栏source group,将刚才新建的汇编文件添加到工程中
  4. 配置项目参数,点击options for target ,在output栏勾上create hex file ,在linker选项栏中取消勾选use memory layout from target dialog ,删除I/O base 和 R/W base 中的内容,将RuninRam.sct 和Ext_ARM初始化文件拷贝到项目根文件夹中,scatter file选中RuninRam配置文件的路径,
  5. 在debug栏中选中jlink仿真器,在设置栏选择速度为自动,配置Ext_ARM配置文件的路径,在utility栏目中取消勾选update target before debuging。
  6. 在linker栏中输入如下内容--diag_suppress=L6314,防止编译报该警告,在汇编编程中,如果只有头尾两部分而没有程序段,将会报错。

使用keil时新建工程遇到的常见错误

在使用友善之臂配套的keil4时,进行编译总是报错,最后使用正点原子的keil5时,报如下错误

.\Objects\asm.axf: Error: L6630E: Invalid token start expected number or ( but found n at position 5 on line 5

 

解决方法:

在options 的Linker选项卡中不要选择 【Use Memory Layout from ...】

并且把下边自动生成的Scatter file文本框清空。

 

对于错误

.\RuninRAM.sct(9): warning: L6314W: No section matches pattern *(InRoot$$Sections).

解决办法:

的警告消息,请使用以下命令:

armlink

在Target中的Linker中有一栏Misc controls,键入 --diag_suppress=L6314
如图: 

keil开发软件的使用

当程序能编译通过,但是进行调试时调试的结果却是错的,寄存器中的值不正确,极有可能是因为debug中的调试文件.axf文件的路径没有设置正确。

使用keil5创建项目后,记住不要导入keil提示的芯片启动文件,别的配置文件要设置正确,别忘了要选中jlink

 

4.3 Keil MDK 编译出现的警告和错误解决

 

warning: A1876W: Use of '|' as a synonym for the :OR: operator is deprecated.

部分源代码:

MSR CPSR_c, #(NoInt|IRQ32Mode) ;进入IRQ模式。

解决方法:把"|"修改为 ":OR:", 如下

MSR CPSR_c, #NoInt:OR:IRQ32Mode ;进入IRQ模式。

 

 

warning: A1608W: MOV pc,<rn> instruction used, but BX <rn> is preferred
解决方法:把MOV pc, <rn> 替换为 BX <rn>


Error: L6238E: os_cpu_a.o(subr) contains invalid call from '~PRES8 (The user did not require code to preserve 8-byte aligment of 8-byte data objects)' function to 'REQ8 (Code was permitted to depend on the 8-byte aligment of 8-byte data items)' function OSIntExit.
解决方法:在汇编程序前面加上 PRESERVE8

PRESERVE8
AREA |subr|, CODE, READONLY
IMPORT OSIntNesting
IMPORT OSTCBCur
IMPORT IsrIRQ

…………


warning: A1085W: Forced user-mode LDM/STM must not be followed by use of banked R8-R14
部分源代码:
STMFD SP,{R3,SP,LR}^ ;系统模式SP→|R0 | 

SUB SP,SP,#12 ;系统模式SP→|SPSR|
解决方法:在两行语句中间加nop,即可解决warning

STMFD SP,{R3,SP,LR}^ ;系统模式SP→|R0 | 
nop
SUB SP,SP,#12 ;系统模式SP→|SPSR|

 

error: L6236E: No section matches selector - no section to be FIRST/LAST.
部分源代码:
RuninFlash.sct
LR_ROM1 0x00000000 
{ ; load region
ER_ROM1 0x00000000 0x0200000 
{ ; load address = execution address
*.o (RESET, +First) ;报错的地方
*(InRoot$$Sections)
.ANY (+RO)
}
RW_RAM1 0x0C000000 0x800000 
{ ; RW data
.ANY (+RW +ZI)
}
}
解决方法:
在启动文件,我的是44binit.s 中找到
AREA Init,CODE,READONLY
改为
AREA RESET,CODE,READONLY