arm linux 应用程序 如何内嵌汇编

arm linux 应用程序 如何内嵌汇编,第1张

在linux源代码中会有一部分c语言与汇编语言相交融的部分。

其中linux中汇编语言采用的不是我们通用的intel的汇编语言,而是采用的是AT&T格式的汇

编语言,它们之间有一些差别:

1

目标与源的方向不大一样

mov

ax,

bx

mov

%bx,

%ax

2

AT&T寄存器前要加入%

ax

%ax

3

AT&T立即数前面要加上$

add

ax,

4

add

%ax,$4

4

对于访问指令的 *** 作数大小

intel的格式是在 *** 作数前加上BYTE

PTR、DWORD

PTR等等

AT&T格式:在 *** 作数后面加上b、l、w等

MOV

AL,

BYTE

PTR

FOO(intel)

movb

FOO,

%al

(AT&T)

5

间接寻址:

SECTION:[BASE+INDEXSCALE+DISP]

Section:disp(base,

index,

scale)

C语言中插入汇编代码比纯粹的汇编要难,因为要设计到“如何分配使用寄存器、怎样与C语

言中变量相结合”

下面“=”代表只读,“+”代表读写

每个输出部分均以=开始

比如我想定义一个char型的变量,放入ax中

register

char

_temp

asm

("ax");

register

char

_temp

__asm__

("ax");

以上两种方式均正确

在这里我们通常看到普通的寄存器前面有两个%,代表下面的意思:第一寄存器前要有一个%

第二对于一个模板前要加入一个%

下面以一个在内核中常见的目的为了实现原子 *** 作的一个函数为例子atomic_add来介绍

static

__inline__

void

atomic_add(int

i,

atomic_t

v)

{

__asm__

__volatile__(

LOCK

"addl

%1,

%0"

:"=m"(v->counter)

:"ir"(i),

"m"(v->counter)

);

}

ir代表一个寄存器中的直接 *** 作数

首先一个头部:__asm__

__volatile__();

asm();

__asm__();告诉编译器里面是汇编语言

:第一个冒号是输出部分:第二个冒号是输入部分

其实还有第三个冒号:代表着损坏部分

asm("汇编语句"

:输出部分

:输入部分

:损坏部分)

%0、%1

等等代表着一种模板 *** 作数,其中数字到几取决于cpu寄存器数量

"m",

"v",

"o"

--内存单元

"r"

任意寄存器

"q"

表示eax、ebx、ecx、edx之一

"i",

"h"

表示立即数

"a",

"b",

"c",

"d"表示eax、ebx、ecx、edx

关键字LOCK表示在执行的时候把系统总线锁住,不让其他

cpu干扰。

方法/步骤

嵌入式 *** 作系统有分时 *** 作系统和实时 *** 作系统,如果 *** 作系统能够使计算机系统及时响应外部事件请求,并能控制所有实时设备和实时任务协调运行,且能在一个规定的时间内完成对事件的处理,怎么这种系统称为实时 *** 作系统。

如果系统必须在极其严格的时间内完成的任务叫做硬件的实时 *** 作系统,如果不是很严格的话就是软件的实时 *** 作系统。

前往官网下载最新版的FreeRTOS系统,然后解压缩到本地。有两个文件夹,FreeRTOS文件夹里面是 *** 作系统内核,FreeRTOS-Plus里面是一些中间件如文件系统,网络协议栈等。

值得一提的是,FreeRTOS的教学用书和API参考手册电子版均已免费提供,建议在现在安装FreeRTOS的同时也一并下载到本地,以供后期学习查阅。

FreeRTOS的主要特点如下:

1 支持抢占式调度,合作式调度和时间片调度

2 具有低功耗模式,称为tickless模式

3 FreeRTOS-MPU支持M3/M4/M7内核的MPU(内存保护单元)

4 典型的内核使用大小在4k~9k

5 支持消息队列、二值信号量、计数信号量、递归信号量和互斥信号量,可用于任务与任务之间的消息传递和同步,任务与终端间的消息传递和同步

6 任务数量不限,任务优先级数量不限

7 高效的软件定时器,不需要损耗额外的CPU时间,除非需要执行定时器任务

8 任务间直接的消息传递,速度较快

9 FreeRTOS的队列是其它通信和同步机制的基础

移植FreeRTOS之前,原有的工程(比如跑马灯,越简单越好)中不能有SysTick、PendSV和SVC三个系统中断的使用,因为FreeRTOS系统要使用这三个中断。

1 准备好简单工程的模板

2 在工程模板中创建FreeRTOS文件夹,并将解压后源码FreeRTOS文件夹中Source目录下的所有内容复制进来

3 在user目录下需要手动窗件FreeRTOSConfigh的配置文件,也可以从官方demo中拿来修改后使用,比如从下载的源码目录下的FreeRTOS/Demo/CORTEX_M4F_STM32F407ZG-SK中进行拷贝

4 将源码文件添加到MDK的工程目录中,其中heap_4c文件路径Source/portable/MemMang,portc的路径FreeRTOS/Source/portable/RVDS/ARM_CM4F,这是因为我们使用的M451是CM4F内核的

在工程中添加新的头文件搜索路径:

\FreeRTOS\include;

\FreeRTOS\portable\RVDS\ARM_CM4F

打开FreeRTOSConfigh配置文件,根据自己硬件配置进行修改

1 首先将文件开头的__ICCARM__修改为__CC_ARM,即把编译器从IAR改为RealView

2 将以下宏配置为0

configUSE_IDLE_HOOK

configUSE_TICK_HOOK

configCHECK_FOR_STACK_OVERFLOW

configUSE_MALLOC_FAILED_HOOK

3 #define configUSE_PREEMPTION 1 将会使能抢占式调度器

4 #define configCPU_CLOCK_HZ ( SystemCoreClock )设置系统主频(M451的系统主频为72MHz)

5 #define configTICK_RATE_HZ ( ( TickType_t ) 1000 )设置系统节拍为1kHz,即1ms

6 #define configMAX_PRIORITIES ( 5 )定义可供用户使用的最大优先级数为5,那么用户可以使用的优先级号是0,1,2,3,4

6 #define configTOTAL_HEAP_SIZE ( ( size_t ) ( 30 1024 ) )定义堆大小,FreeRTOS内核,用户动态申请内存,任务栈等都需要这个空间

4 将工程整体重新编译一次,这样FreeRTOS基本移植结束了

编写测试程序来验证一致的FreeRTOS是否已经可以使用

1 在mainc中添加一下几个头文件

#include "FreeRTOSh"

#include "taskh"

#include "queueh"

#include "croutineh"

2 在main函数的开头,禁止全局中断(除了NMI和HardFault),具体方法是:__set_PRIMASK(1);这样做的好处是可以防止执行的中断服务程序中有FreeRTOS的API函数,保证系统正常启动,不受别的中断影响。在portc中的函数prvStartFirstTask中会重新开启全局中断

3 创建任务AppTaskCreate();

4 启动调度,开始执行任务vTaskStartScheduler();

烧写程序,运行,可以从串口看到正确的输出信息

以上就是关于arm linux 应用程序 如何内嵌汇编全部的内容,包括:arm linux 应用程序 如何内嵌汇编、如何将linux下的程序,移植到freertos中、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9737833.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-01
下一篇2023-05-01

发表评论

登录后才能评论

评论列表(0条)

    保存