![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
ARM
binbinyantai
脚踏实地,一步一个脚印的积累
展开
-
gcc内嵌汇编 __asm__ __volatile__ 理解
gcc内嵌汇编简介在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达式的值读入哪个寄存器,以及如何将计算结果写回C 变量,你只要告诉程序中C语言表达式与汇编指令操作数之间的对应关系即可, GCC会自动插入代码完成必要的操作。1、简单的内嵌汇编例:__asm__ __volatile__("hlt"); "__asm__"表示后面的代码为内嵌汇编转载 2018-01-05 19:19:34 · 2551 阅读 · 0 评论 -
warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
下面的文章详细介绍了这个warning的来源和解决方法。也可以关闭优化,当然关闭优化并不是最终解决方法。down voteacceptedFirst off, let's examine why you get the aliasing violation warnings.Aliasing rules simply say that y转载 2018-01-09 19:38:35 · 3262 阅读 · 0 评论 -
__attribute__ 编译属性
今天看到下面语句不理解,查询了一下。作为记录__attribute__((section(".bsp_start_text")))__attribute__这个关键词是GNU编译器中的编译属性,ARM编译器也支持这个用法。__attribute__主要用于改变所声明或定义的函数或 数据的特性,它有很多子项,用于改变作用对象的特性。比如对函数,noline将禁止进行内联扩展、noretu转载 2018-01-08 10:32:48 · 371 阅读 · 0 评论 -
naked 特性
对于nake的不理解,查看了arm的文档。发现就是指定编译器不要产生序言和结尾。只能用__asm This attribute tells the compiler that the function is an embedded assembly function. You can write the body of the function entirely in assembly c翻译 2018-01-07 14:09:06 · 2851 阅读 · 0 评论 -
大端和小端存储
如果将一个32位的整数0x12345678存放到一个整型变量(int)中,这个整型变量采用大端或者小端模式在内存中的存储由下表所示。为简单起见,本文使用OP0表示一个32位数据的最高字节MSB(Most Significant Byte),使用OP3表示一个32位数据最低字节LSB(Least Significant Byte)。 地址偏移大端模转载 2018-01-07 13:25:48 · 208 阅读 · 0 评论 -
gcc 编译选项
一些编译选项要了解,比如-march=armv7-a -mthumb -mfpu=neon -mfloat-abi=hard -marm可以参考下面的链接https://gcc.gnu.org/onlinedocs/gcc/ARM-Options.html原创 2018-01-07 13:10:53 · 632 阅读 · 0 评论 -
汇编指令 定义一个函数入口的宏的解释
经常,我们在看代码的时候对一些汇编的directives不明白。那么以下面为例,#define FUNCTION_THUMB_ENTRY(name) \ .thumb; \ .thumb_func; \ .align 2; \ .globl name; \ .type name, %function; \ name:The .thum原创 2018-01-07 11:52:50 · 1854 阅读 · 0 评论 -
查看gcc预编译的宏
在阅读很多源码的时候经常被一些宏定义搞晕,因为这些宏定义在源码中没有定义,那么就有可能是编译器预定义的。至于编译器的学习,那是另外一部分,暂时不考虑但是我们可以查看预编译的宏,采用gcc -E -dM - -E 预处理后即停止,不进行编译.预处理后的代码送往标准输出. GCC忽略任何不需要预处理的输入文件.-dM 告诉预处理器输出有效的宏定义列表(预处原创 2018-01-07 11:03:52 · 1771 阅读 · 0 评论 -
c语言#和## 的用法
关于#和##在C语言的宏中,#的功能是将其后面的宏参数进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号。比如下面代码中的宏:#define WARN_IF(EXP) do{ if (EXP) fprintf(stderr, "Warning: " #EXP "/n"); } while(0)那么转载 2018-01-07 11:24:37 · 1297 阅读 · 0 评论 -
ARM 汇编 .extern 和.global
.global.global关键字用来让一个符号对链接器可见,可以供其他链接对象模块使用。 .global _start 让_start符号成为可见的标示符,这样链接器就知道跳转到程序中的什么地方并开始执行。linux寻找这个 _start标签作为程序的默认进入点。在汇编和C混合编程中,在GNU ARM编译环境下,汇编程序中要使用.global伪操作声明汇编程序为全局的函数转载 2018-01-07 10:15:29 · 1572 阅读 · 0 评论 -
ARM pc指针低两位为何为0
PC是32位的(31:0)。ARM状态下,指令是32位的,指令地址都是4字节对齐,所以PC值肯定是4的倍数,所以最低两位(位[1:0])肯定为0,前面的30位位[31:2]用于保存PC如果是thumb状态,指令是16位的,指令地址是2字节对齐。原创 2018-01-06 12:00:20 · 2283 阅读 · 0 评论 -
备注内存访问顺序的文章
备注内存访问顺序的文章,有时间看看https://community.arm.com/processors/b/blog/posts/memory-access-ordering---an-introduction原创 2018-01-06 10:27:50 · 197 阅读 · 0 评论 -
DMB DSB ISB 简介
DMB: Data memory barrier理解DMB指令,先看下面例子,在core 0和core1上同时跑两个不同的指令(如下表所示)core 0core 1Write A;Write B;Load B;Load A;这里core0在执行两个指令,写A B两个值的时候,可能会发生乱序也可能Write A时发生Ca转载 2018-01-06 10:21:50 · 10451 阅读 · 0 评论 -
内存隔离指令(memory barrier instructions)的使用
像ARM7TDMI这样经典的ARM处理器会按照程序的顺序来执行指令或访问数据。而最新的ARM处理器会对执行指令和访问数据的顺序进行优化。举个例子,ARM v6/v7的处理器会对以下指令顺序进行优化。 [cpp] view plain copyLDR r0, [r1] ; 从普通/可Cache的内存中读取,并导致cache未命中转载 2018-01-06 10:07:36 · 2281 阅读 · 0 评论 -
volatile和 memory barrier
volatile c语言中 volatile 关键字用于告诉编译器,严禁将此处的汇编语句与其它的语句重组合优化。volatile只能保证编译器不会做乱序执行优化. 1. 不对*p操作生成乱序指令(通常如此,具体请看后面的解释)(比如条件判断) 2. 每次从*p取数据的时候,一定会进行一次访存操作,哪怕前面不久才取过*p转载 2018-01-05 19:40:02 · 848 阅读 · 0 评论 -
DMIPS/MHZ的解释
今天看arm处理器的时候这个单位不明白,网上搜索一下终于明白了,记录如下。DMIPS: Dhrystone Million Instructions executed Per Second :主要用于测整数计算能力。 其中: MIPS: Million Instructions executed Per Second,每秒百万条指令,用来计算同一秒内系统的处理能力,即每秒执行了多少百万条指令 ...转载 2018-02-23 10:30:49 · 18982 阅读 · 1 评论