keil

Inline assembly statements in C code and extended ASM for ARM Cortex architectures

你。 提交于 2021-02-17 05:18:30
问题 I am trying to compile the following two pieces of code with ARM Compiler 5 for a Cortex A microprocessor: Part 1 : static inline void cp15_write_sctlr(uint32_t value) { asm("mcr p15, 0, %0, c1, c0, 0" :: "r"(value)); } static inline uint32_t cp15_read_actlr(void) { uint32_t actlr; asm("mrc p15, 0, %0, c1, c0, 1" : "=r"(actlr)); return actlr; } Part 2 : static inline void dmb(void) { asm("dmb" ::: "memory"); } static inline void dsb(void) { asm("dsb" ::: "memory"); } static inline void isb

IRQ symbol defined in static library does not override weak IRQ definition from ARM/GCC startup

大憨熊 提交于 2021-02-10 06:42:26
问题 I have built a static library (*.a for gcc, *.lib for keil). One of its source file, compiled into library, contains definition of RADIO_IRQHandler. An excerpt from this source file, called "ral_irq_handlers.c", is below: ... void ral_symbol_import(void) //dummy function { return; } ... void RADIO_IRQHandler(void) { ... } ... This IRQ symbol definition should override the weak definition which is declared in startup file. The startup file is not compiled into any static library and is just a

Place segments of external static library to specific locations

你说的曾经没有我的故事 提交于 2020-07-05 07:36:07
问题 My application calls some functions which are placed in an external static library. I link the external static library to my application and everything works (in this case I'm using GCC). Nevertheless, the locations (addresses) of text, .data and .bss sections of the library are chosen by the linker. I can choose/change their locations by modifying the linker script, but it's tedious as I have to specify all the functions, variables, etc. of the library. What I mean it's something like: . =

keil与proteus联调(VMD51.dll)

对着背影说爱祢 提交于 2020-04-15 15:05:57
【推荐阅读】微服务还能火多久?>>> 1、把proteus安装目录下 VDM51.dll(如果没有可以到网上下载)文件复制到Keil安装目录的 \C51\BIN 目录中。 2、修改keil安装目录下 Tools.ini文件,在C51字段加入TDRV5=BIN\VDM51.DLL ("Proteus VSM Monitor-51 Driver"),保存 注意:不一定要用TDRV5,根据原来字段选用一个不重复的数值就可以了。引号内的 名字随意 3、打开proteus,画出相应电路。在proteus的tools菜单中选中use remote debug monitor 4、进入KEIL的project菜单option for target '工程名'。在DEBUG选项中右栏上部的下拉菜选中 Proteus VSM Monitor-51 Driver。 在进入seting,如果同一台机IP 名为127.0.0.1,如不是同一台机则填另一 台的IP地址。端口号一定为8000 注意:可以在一台机器上运行keil,另一台中运行proteus进行远程仿真 5、在keil中进行debug吧,同时在proteus中查看直观的结果(如LCD显示…) 来源: oschina 链接: https://my.oschina.net/u/96486/blog/14824

Keil C编译器的变量存储分配

我的梦境 提交于 2020-04-07 13:53:48
问题:以下是我编译工程后出现的错误:       *** ERROR L107: ADDRESS SPACE OVERFLOW        SPACE: DATA        SEGMENT: _DATA_GROUP_        LENGTH: 0020H         Program Size: data=134.3 xdata=226 code=3544 问题描述:Data数据段的地址空间溢出,从描述可以知道编译器存储了三块信息: 134字节的数据段,226字节的扩展数据段和3544字节的代码段。    当前我所使用的芯片是STC的STC15W408AS。 问题原因:查询STC15W408AS的数据手册不难知道,其存储空间包括256字节的idata和256字节的xdata(内部扩展,非外部扩展)。4k以上的flash用以存储代码。 而256byte的idata又可以划分为:1.低128byte的idata为传统的8051ram区 2.高128byte的idata为8052扩展的ram区          低128byte又可划分为工作寄存器区,可位寻址区,用户ram区和堆栈区。 Keil C编译器一般情况下优先将变量存储在地址范围为30H-7FH的用户ram区。但是当工程中主函数在进行函数调用时,会将当前所使用 的变量暂存到堆栈区以在函数返回的时候正常恢复程序的上下文

Keil的c语言编译器

守給你的承諾、 提交于 2020-04-07 13:18:26
我曾经通过查看反汇编代码对KEILC编译器进行了测试,大概有这么一下内容,也得出一些结论。 (1) 全局变量 :如果程序中定义了全局变量,而且初始值不是0。此时,在程序调到main()函数执行前,除了要进行内存清零、初始化堆栈外,还需要将全局变量的初始值加载到内存的指定区域(编译过程中为全局变量分配的空间)。 (2) 局部变量 :局部变量通常使用那些缓冲内存(用作保存运算过程的中间数据)。初始化的局部变量,通常程序中都会对用到的缓冲内存重新赋值。 但是,对于没有初始化的局部变量需要注意“ 无知情的情况下被赋了值 ”。下边的子函数中定义了变量,但是并未初始化。按照标准C语言的准则,未初始化的变量的初值默认是0,但是KEIL对未初始化的局部变量的处理不是这样的。 void function() { unsigned char k,j; if (k<j) ; else { } } 实际的编译后的反汇编程序看不到对这些局部变量的初始化。这些局部变量可能会占据那些还未被使用的内存或者其他子函数中局部变量已经释放的空间(但是这些空间可能并没有清零)。倘若是后者,其他函数局部变量释放的空间由于并没有清零,所以这些局部变量就一开始被赋了不能预先知道的值,这是不希望看到的。所以如果使用一个局部变量,就给这个变量赋个初值。 (3)谨防程序在“ 无知情的情况下被优化 ”

KEIL C51代码优化详细分析

狂风中的少年 提交于 2020-04-06 07:55:19
阅读了《 单片机 与 嵌入式 系统应用》2005年第10期杂志《经验交流》栏目的一篇文章《Keil C51 对同一端口的连续读取方法》(原文)后,笔者认为该文并未就此问题进行深入准确的分析 文章中提到的两种解决方法并不直接和简单。笔者认为这并非是Keil C51中不能处理对一个端口进行连续读写的问题,而是对Kei1 C51的使用不够熟悉和设计不够细致的问题,因此特撰写本文。 本文中对原文提到的问题,提出了三种不同于原文的解决方法。每种方法都比原文中提到的方法更直接和简单,设计也更规范。(无意批评,请原文作者见谅) 1 问题回顾和分析 原文中提到:在实际工作中遇到对同一端口反复连续读取,Keil C51编译并未达到预期的结果。原文作者对C编译出来的汇编程序进行分析发现,对同一端口的第二次读取语句并未被编译。但可惜原文作者并未分析没有被编译的原因,而是匆忙地采用一些不太规范的方法试验出了两种解决办法。 对此问题,翻阅Keil C51的手册很容易发现:KeilC51的编译器有一个优化设置,不同的优化设置,会产生不同的编译结果。一般情况缺省编译优化设置被设定为8级优化,实际最高可设定为9级优化: 1. Dead code elimination。 2.Data overlaying。 3.Peephole optimization。 4.Register variables。 5

KEIL中程序优化说明

时间秒杀一切 提交于 2020-04-06 04:08:31
优化级别说明(仅供参考) : 则其中的 Code Optimization 栏就是用来设置 C51 的优化级别。共有 9 个优化 级别(书上这么写的) ,高优化级别中包含了前面所有的优化级别。现将各个级 别说明如下: 0 级优化: 1 、 常数折叠:只要有可能,编译器就执行将表达式化为常数数字的计算,其中 包括运行地址的计算。 2 、 简单访问优化:对 8051 系统的内部数据和位地址进行访问优化。 3 、 跳转优化:编译器总是将跳转延至最终目标上,因此跳转到跳转之间的命令 被删除。 1 级优化: 1 、 死码消除:无用的代码段被消除。 2 、 跳转否决:根据一个测试回溯,条件跳转被仔细检查,以决定是否能够简化 或删除。 2 级优化: 1 、 数据覆盖:适于静态覆盖的数据和位段被鉴别并标记出来。连接定位器 BL51 通过对全局数据流的分析,选择可静态覆盖的段。 3 级优化: 1 、 “ 窥孔 ” 优化:将冗余的 MOV 命令去掉,包括不必要的从存储器装入对象及 装入常数的操作。另外如果能节省存储空间或者程序执行时间,复杂操作将由简 单操作所代替。 4 级优化: 1 、 寄存器变量:使自动变量和函数参数尽可能位于工作寄存器中,只要有可能, 将不为这些变量保留数据存储器空间。 2 、扩展访问优化:来自 IDATA 、 XDATA 、 PDATA 和 CODE 区域的变量直接包

keil优化等级设置

回眸只為那壹抹淺笑 提交于 2020-04-04 01:53:04
keil优化等级设置 优化级别说明(仅供参考): 则其中的 Code Optimization 栏就是用来设置C51的优化级别。共有9个优化级别(书上这么写的),高优化级别中包含了前面所有的优化级别。现将各个级别说明如下: 0级优化: 1、 常数折叠:只要有可能,编译器就执行将表达式化为常数数字的计算,其中包括运行地址的计算。 2、 简单访问优化:对8051系统的内部数据和位地址进行访问优化。 3、 跳转优化:编译器总是将跳转延至最终目标上,因此跳转到跳转之间的命令被删除。 1级优化: 1、 死码消除:无用的代码段被消除。 2、 跳转否决:根据一个测试回溯,条件跳转被仔细检查,以决定是否能够简化或删除。 2级优化: 1、 数据覆盖:适于静态覆盖的数据和位段被鉴别并标记出来。连接定位器BL51通过对全局数据流的分析,选择可静态覆盖的段。 3级优化: 1、“窥孔”优化:将冗余的MOV命令去掉,包括不必要的从存储器装入对象及装入常数的操作。另外如果能节省存储空间或者程序执行时间,复杂操作将由简单操作所代替。 4级优化: 1、 寄存器变量:使自动变量和函数参数尽可能位于工作寄存器中,只要有可能,将不为这些变量保留数据存储器空间。 2、扩展访问优化:来自IDATA、XDATA、PDATA和CODE区域的变量直接包含在操作之中,因此大多数时候没有必要将其装入中间寄存器。 3、局部公共子式消除

【持续更新】单片机学习和开发的keil下源代码 + proteus仿真

假装没事ソ 提交于 2020-03-31 00:36:55
keil里的c或asm源代码,keil编译生成的文件,keil工程文件和相应的proteus工程文件都放在一个文件夹下,链接以zip包形式给出。 keil用的是uVersion4, Proteus用的是7.4 sp3 道客巴巴上的《89c51单片机入门》上的例子以及其中未提供源代码的练习,每个都在proteus上仿真过。 1.包含初期的很多简单的汇编程序,主要是led,按钮以及定时器/计数器相关的练习 http://files.cnblogs.com/PrajnaKit/FirstProteusProject.zip 2.通过蜂鸣器/扬声器播放音乐的练习。《89c51单片机入门》里提供的代码无法仿真,我又从网上找了个《兰花草》的音乐播放程序,可以成功仿真。 蜂鸣器/扬声器发声原理:通过改变通断之间的延时来改变发出的音调,通过重复这种通断的延时来达到控制发出声音的长短。 http://files.cnblogs.com/PrajnaKit/musicPlayer.zip 3.定时器/计数器的中断以及配合使用,外部时钟输入等 http://files.cnblogs.com/PrajnaKit/timer_counter.zip 正在做键盘的实验,花了一天时间才把键盘查表程序完成,主要是学到jmp @a+dptr的用法,还得继续。。。 【更新1】 键盘的软件去抖实验