5.1 C语言和汇编混合编程

C语言和汇编的混合编程,实现混合编程的一个重要方面就是要实现C代码和汇编代码的数据、函数共享。

汇编程序以.S结尾,在/work/uClinux-dist/user/下新建一个scu1的文件夹。在文件夹里新建一个文件testasm.S,在testasm.S里用汇编写两个函数,实现两个数的加减。如下

.text
.global MyAdd
.global MySub
MyAdd:
add r0, r0, r1
mov pc, lr
MySub:
sub r0, r0, r1
mov pc, lr

然后,在C语言里调用这两个函数,在scu1里新建一个test.c文件。内容如下:

#include <stdio.h>
extern int MyAdd(int a, int b);
extern int MySub(int a,int b);
int main(void)
{
      printf(“\nMyAdd=%d”, MyAdd(5,6));
      printf(“\nMySub=%d”, MySub(8,3));
      return 0;
}

其中,extern在汇编中用来引用一个在其他模块中定义过的符号名,使得这个符号名所表示的数据或函数能在该模块中被使用。Extern申明为外部函数。最后需要一个Makefile文件,

EXECS = test
OBJS = testasm.o test.o
AFLAGS := -mapcs-32
all: $(EXECS)
testasm.o: testasm.S
      $(CC) $(AFLAGS) -c -o $@ $<
$(EXECS): $(OBJS)
      $(CC) $(LDFLAGS) -o $@ $(OBJS) $(LDLIBS)
romfs:
      $(ROMFSINST) /bin/test

但这三个文件代码写好了以后,在/work/uClinux-dist目录下执行sudo make,检查是否报错。如果没有报错,下到开发板里面去运行一下,再开发板里的执行结果如下:

5.2 阅读cpu_arm946_reset(loc)

在路径/work/uClinux-dist /linux-2.4.x/arch/armnommu/mm/proc-arm946.S下,找到该函数,函数如下:

* cpu_arm946_reset(loc)

* Perform a soft reset of the system. Put the CPU into the

* same state as it would be if it had been reset, and branch

* to what would be the reset vector.

* loc: location to jump to for soft reset

*/

.align      5

ENTRY(cpu_arm946_reset)

mov ip, #0

mcr p15, 0, ip, c7, c7, 0       @ invalidate I,D caches

mrc p15, 0, ip, c1, c0, 0       @ ctrl register

bic   ip, ip, #0x000f             @ ............wcam

bic   ip, ip, #0x1100            @ ...i...s........

mcr p15, 0, ip, c1, c0, 0       @ ctrl register

mov pc, r0

这个程序是对arm946CPU进行软件复位,首先分配5个字节空间存放代码,MCR 传送 ARM 寄存器 Rd 的内容到协处理器,MRC 从协处理器传送一个单一的字并把它放置到 ARM 寄存器 Rd 中,bic是在一个字中清除位的一种方法,与 OR 位设置是相反的操作,这条指令的目的是清除位0,1,2,3,保持其他位不变。

5.3 问题解答

通过阅读芯片手册Part 1 - FireFox-Overview-Rev0-1 – 120602和Part 2 - FirefoxCPU-Benjamin_Nov_01_02可以找到相应问题的答案。

(1) Which pin is used to select boot chip?

BOOTCSn(Pin65)

(2) Which pins are used to select SDRAM?

M_CS[2:0]n(Pin56,Pin57,Pin85)

(3) What is the base address of boot device?

0xFFC0_0000

(4) What is the base address of GPIO registers?

0x8000_D000

(5) What is the base address of UART registers?

0x8000_C840

5.4 总结

这节课主要讲了汇编和C语言的混合编程,同时也主要阅读相关的文档来加深理解,尤其是做嵌入式的,芯片手册的阅读是一个必须经过的的过程,只有通过阅读手册,才能对芯片有一个深入的了解,这节课讲解的内容不多,但阅读量是非常大的,用一个周都是看不完的,接下来还得继续。

转载于:https://www.cnblogs.com/LiuFarrell/p/9836737.html

第5课 混合编程和芯片手册阅读相关推荐

  1. FPGA芯片手册阅读技巧

    FPGA的管脚主要包括:用户I/O(User I/O).配置管脚.电源.时钟及特殊应用管脚等.其中有些管脚可有多种用途,所以在设计FPGA电路之前,需要认真的阅读相应FPGA的芯片手册. 下面以ALT ...

  2. ATSHA204芯片手册阅读笔记

    使用心得: (1)配置好IIC,访问芯片之前先唤醒. (2)按个人需求配置好Config区域,配置好之后锁住Config.只有锁住了Config,才能去操作Data区. (3)开始写数据区,可以将一些 ...

  3. AD9235芯片手册阅读笔记

    特征 单个3 V电源操作(2.7 V至3.6 V) SNR=70 dBc至65 MSPS时的奈奎斯特 SFDR=85 dBc至65MSPS时奈奎斯特低功率: 300 mW至65 MSPS差分输入,带5 ...

  4. 14015.xilinx-芯片手册阅读笔记

    文章目录 1 xilinx芯片手册阅读笔记 1 Introduction 介绍 1.1 System Block Diagram 系统框图 1.2 Power Domains and Islands ...

  5. (摘)TMS320 DSP混合编程的方法研究

    作者:北京航空-    文章来源:电子技术应用    点击数:1158    更新时间:2005-5-6 摘要:提出并分析了在考虑程序代码效率.执行效率和程序的可读性及可移植性的情况下,对于TMS32 ...

  6. STM32 进阶教程 7 -  C与C++混合编程

    前言 在嵌入式开发过程中经常会用到第三个芯片/设备,这些第三方的芯片提供的DEMO程序或驱动程序有时候是C++,如果先前的系统用C语言写的就会出现点问题,往往需先将C++的驱动程序自已手动改成C语言再 ...

  7. ARM中C和汇编混合编程及示例

    在嵌入式系统开发中,目前使用的主要编程语言是C和汇编,C++已经有相应的编译器,但是现在使用还是比较少的.在稍大规模的嵌入式软件中,例如含有OS,大部分的代码都是用C编写的,主要是因为C语言的结构比较 ...

  8. 【CYW20189】一、芯片手册

    目录: 1. 前言 2. 概要 3. 特点 4. 应用领域 5. 微处理器单元 5.1 主晶体振荡器 5.2 32k Hz 晶体振荡器 5.3 低频时钟源 5.4 Power Mode 5.5 Wat ...

  9. YT8511芯片手册 解析|CSDN创作打卡

    文章目录 特性 模式选择 性能解析 电源提供 重点寄存器配置 硬件上电时序 回环测试 可用于替换芯片 特性 兼容10BASE-Te/100BASE-Tx/ 1000base - t 支持WoL (wa ...

  10. 树莓派高级开发之树莓派博通BCM2835芯片手册导读与及“相关IO口驱动代码的编写”

    首先我们要知道,驱动的两大利器:电路图(通过电路图去寻找寄存器)和芯片手册 一.寄存器的介绍 芯片手册第六章的89页,GPIO有41个寄存器,所有访问都是32位的.Description是寄存器的功能 ...

最新文章

  1. _catboost.CatBoostError: C:/Program Files (x86)/Go Agent/pipelines/BuildMaster/catboost.git/catboost
  2. 计算机桌面放大镜,电脑桌面放大镜软件(OneLoupe)
  3. 图书管理系统python源代码-Python实现图书管理系统
  4. android130 android启动
  5. Linux进程间通信一 System V 共享内存简介与示例
  6. Verilog自编函数clog2替代SV中的系统函数$clog2
  7. spring学习(11):使用配置类
  8. Log4j 与 Logback的ConversionPattern对比
  9. python拆分字符串函数_Python字符串操作-拆分,切片,从HEX转换为DEC
  10. 彼得林奇:赚钱密码(1990年一次演讲)
  11. Tippy.js - 免费开源且高度可定制的气泡提示独立组件
  12. html中svg修改背景颜色,如何更改SVG图像中的背景颜色?
  13. [计算机网络-03] 数据链路层
  14. 干货 | 京东云域名注册及备案最佳实践
  15. [Oracle 11g r2(11.2.0.4.0)]集群守护进程gpnp介绍
  16. 如何利用pyecharts绘制酷炫的桑基图?
  17. 微型计算机原理与接口技术——8086指令系统之数据传送指令
  18. C语言逻辑类型与运算
  19. 初探密码破译:Metropolis-Hastings算法破解密文
  20. 【mq】从零开始实现 mq-09-消费者拉取消息 pull message

热门文章

  1. java基本操作-2
  2. python-gui-pyqt5的使用方法-4--自定义信号的初识--多参数的使用
  3. docker基础4--docker的命令
  4. curl 安装_实用干货——如何使用curl命令下载文件
  5. larvel mysql count,Laravel带条件查询多个count
  6. Weex + Ui - Weex Conf 2018
  7. Openresty 学习笔记(二)Nginx Lua 正则表达式相关API
  8. html 制作静态页面新知识
  9. mysql 常用函数总计
  10. WPF入门教程系列二十——ListView示例(二)