第5课 混合编程和芯片手册阅读
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课 混合编程和芯片手册阅读相关推荐
- FPGA芯片手册阅读技巧
FPGA的管脚主要包括:用户I/O(User I/O).配置管脚.电源.时钟及特殊应用管脚等.其中有些管脚可有多种用途,所以在设计FPGA电路之前,需要认真的阅读相应FPGA的芯片手册. 下面以ALT ...
- ATSHA204芯片手册阅读笔记
使用心得: (1)配置好IIC,访问芯片之前先唤醒. (2)按个人需求配置好Config区域,配置好之后锁住Config.只有锁住了Config,才能去操作Data区. (3)开始写数据区,可以将一些 ...
- AD9235芯片手册阅读笔记
特征 单个3 V电源操作(2.7 V至3.6 V) SNR=70 dBc至65 MSPS时的奈奎斯特 SFDR=85 dBc至65MSPS时奈奎斯特低功率: 300 mW至65 MSPS差分输入,带5 ...
- 14015.xilinx-芯片手册阅读笔记
文章目录 1 xilinx芯片手册阅读笔记 1 Introduction 介绍 1.1 System Block Diagram 系统框图 1.2 Power Domains and Islands ...
- (摘)TMS320 DSP混合编程的方法研究
作者:北京航空- 文章来源:电子技术应用 点击数:1158 更新时间:2005-5-6 摘要:提出并分析了在考虑程序代码效率.执行效率和程序的可读性及可移植性的情况下,对于TMS32 ...
- STM32 进阶教程 7 - C与C++混合编程
前言 在嵌入式开发过程中经常会用到第三个芯片/设备,这些第三方的芯片提供的DEMO程序或驱动程序有时候是C++,如果先前的系统用C语言写的就会出现点问题,往往需先将C++的驱动程序自已手动改成C语言再 ...
- ARM中C和汇编混合编程及示例
在嵌入式系统开发中,目前使用的主要编程语言是C和汇编,C++已经有相应的编译器,但是现在使用还是比较少的.在稍大规模的嵌入式软件中,例如含有OS,大部分的代码都是用C编写的,主要是因为C语言的结构比较 ...
- 【CYW20189】一、芯片手册
目录: 1. 前言 2. 概要 3. 特点 4. 应用领域 5. 微处理器单元 5.1 主晶体振荡器 5.2 32k Hz 晶体振荡器 5.3 低频时钟源 5.4 Power Mode 5.5 Wat ...
- YT8511芯片手册 解析|CSDN创作打卡
文章目录 特性 模式选择 性能解析 电源提供 重点寄存器配置 硬件上电时序 回环测试 可用于替换芯片 特性 兼容10BASE-Te/100BASE-Tx/ 1000base - t 支持WoL (wa ...
- 树莓派高级开发之树莓派博通BCM2835芯片手册导读与及“相关IO口驱动代码的编写”
首先我们要知道,驱动的两大利器:电路图(通过电路图去寻找寄存器)和芯片手册 一.寄存器的介绍 芯片手册第六章的89页,GPIO有41个寄存器,所有访问都是32位的.Description是寄存器的功能 ...
最新文章
- _catboost.CatBoostError: C:/Program Files (x86)/Go Agent/pipelines/BuildMaster/catboost.git/catboost
- 计算机桌面放大镜,电脑桌面放大镜软件(OneLoupe)
- 图书管理系统python源代码-Python实现图书管理系统
- android130 android启动
- Linux进程间通信一 System V 共享内存简介与示例
- Verilog自编函数clog2替代SV中的系统函数$clog2
- spring学习(11):使用配置类
- Log4j 与 Logback的ConversionPattern对比
- python拆分字符串函数_Python字符串操作-拆分,切片,从HEX转换为DEC
- 彼得林奇:赚钱密码(1990年一次演讲)
- Tippy.js - 免费开源且高度可定制的气泡提示独立组件
- html中svg修改背景颜色,如何更改SVG图像中的背景颜色?
- [计算机网络-03] 数据链路层
- 干货 | 京东云域名注册及备案最佳实践
- [Oracle 11g r2(11.2.0.4.0)]集群守护进程gpnp介绍
- 如何利用pyecharts绘制酷炫的桑基图?
- 微型计算机原理与接口技术——8086指令系统之数据传送指令
- C语言逻辑类型与运算
- 初探密码破译:Metropolis-Hastings算法破解密文
- 【mq】从零开始实现 mq-09-消费者拉取消息 pull message