版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C和ASM的混合编程jianghq2003-5 Tsinghua DEE单片机与嵌入式系统Content 程序的结构 汇编程序 C程序 project框架 如何改写汇编程序? 在C程序中如何做一些底层操作?存储空间结构程序的结构汇编程序结构C程序结构M30624FGFP Memory Map几个主要的参数 RAM区 ramTOPramEND ROM区 progTOP Vvector汇编程序结构段类型RAM DATAROM CODE ROMDATA汇编程序结构 段定义.SECTIONmemory,DATA ; 数据段.ORGVramTOP.SECTIONprog,CODE; 代码段.ORGVpr
2、ogTOP.SECTIONval_vect,ROMDATA ;用户自定义中断向量段.ORGVintbase.SECTIONinter,ROMDATA ;固定中断向量段.ORGVvector+(8*4) 汇编程序中几个主要的参数VramTOP.EQU 000400HVramEND.EQU 002BFFHVIstack.EQU 002C00H ISPVprogTOP.EQU 0F0000HVintbase.EQU 0FA000HVvector.EQU 0FFFDCH SB_base.EQU 000380H SB关于SB和FB.SBSB_base.SBSYM recv_nums 告诉编译器使用该变量
3、的指令寻址方式采用相对基址寻址方式,可以提高生成代码的效率。关于堆栈两种堆栈:堆栈指针ISP和USP使用何种堆栈,由堆栈指针选择标志位(U标志)选取。U = 0 选取中断堆栈指针ISP U = 1 选取用户堆栈指针USP响应中断后,该标志清0,执行中断子程序SP指针位置如何设定: 栈顶指针Push : SP = SP 1 Pop : SP = SP + 1C程序结构RAM DATA data bss stack heapROM CODE program ROMDATA rom vector fvectorNC编译器对Section的处理Section的属性属性:I(是否初值), N/F(扩展区
4、) S(SB寻址区), E/O(偶地址对齐)举例:bss_SE, bss_NE, data_FE, data_SEIdata_SEbss_SEdata_SObss_SOdata_NEbss_NEdata_NObss_NOstackheapdata_FEbss_FEdata_FOdata_FE C程序中所有的section列表DATArom_NErom_NOrom_FErom_FOdata_SEIdata_SOIdata_NEIdata_NOIdata_FEIdata_FOIvectorfvectorROMDATACODEprograminterruptprogram_S根据芯片修改sect30
5、.inc注释掉不存在的段最重要的三个段的位置设定.sectiondata_SE,DATA.org400H.sectionrom_FE,ROMDATA.org0C0000H.sectionvector,ROMDATA.orgVECTOR_ADR VECTOR_ADR .equ0FA000H其他的段就交给编译器来处理例子:一个Section分配的结果C程序结构 project 可能包括多个asm文件, C文件 如何安排project的结构?程序的入口 首先要清楚整个程序的执行过程 从哪里开始执行?Startup文件 sect30.inc文件; fixed vector 0ff
6、fdchNMI:.lworddummy_intRESET:.lwordstart .endStartup文件 ncrt0.a30文件.glbstart.sectioninterruptstart:;-; after reset,this program will start;-ldc#istack_top,isp;set istack pointerncrt0.a30设定单片机工作模式RAM 清0变量初值设定堆初始化调用全局Init子程序调用全局Main子程序exit循环启动过程 主主C程序程序Void Init()Void Main()主C文件: init() int1(); int2();
7、 int3(); main() sub1(); sub4(); Project层次框架Startup文件: ncrt0.a30系统提供的库程序: #include “stdlib.h”ASM子程序: init1(); sub1()C子程序1: init2(); sub2(); sub3()C子程序2: init3(); sub4(); ASM子程序: init4(); sub5()一个project的层次图程序结构小结 明白各个Section的含义 根据芯片参数和自己的程序需要来修改startup程序 用层次化来保持整个组织结构的清晰如何改写汇编程序? 目标: 将他人提供的汇编程序转为可供自己
8、在C程序中调用的子函数。 例子: 红外接收的子程序Step1 大致看懂原程序 完成了一个什么样的功能。 主要的几个变量是什么含义。Step2 分析自己的要求 如果将该汇编程序独立出来作为一个子函数; 那么其功能是什么? 输入参数:有哪些 返回值: 有哪些 我希望实现的功能 等待接收一个字节,如果收到立刻返回该字节,没收到且时间超过300ms,那么也返回,同时指示状态为未接收。 char recv_status = IR_RECV(char userID, char* pByte); 指示接收状态 接收用户码 接收字节地址Step3 对原来的程序进行裁减 删去原有的各个段定义 重新定义各个Sec
9、tion:bss_SE, rom_FE, program 定义和声明全局子函数 _IRR_INIT _IR_RECV I_timera0涉及C和汇编子程序之间的参数传递(详见下文) 删除不必要的变量和程序 如果使用中断,则将中断向量表设置挪至sect30.inc 最后以.end结束文件C和汇编子程序之间的参数传递 参数规则(从C到汇编) 参数规则(从汇编返回到C) 函数名定义规则参数规则(从C到汇编)采用#pragma PARAMETER参数规则(从汇编到C)函数名定义规则最后结果C程序部分:extern char IR_RECV(char,char*); #pragma PARAMETER
10、IR_RECV(R0L,A0)汇编语言部分:.glb _IR_RECV; 全局调用声明_IR_RECV:mov.b R0L,N_CSTM; 参数传递:用户码mov.w A0, SAVE_ADDR; 参数传递:接收结果地址 mov.b #1, R0L; 返回1,如果收到了数据 改写汇编程序小结 看懂源程序 在明白自己所需要的功能后,再进行修改有的时候还是需要改多一些地方。该例子存放到在C程序中如何做一些底层操作 特殊寄存器的操作 BIT操作特殊寄存器的操作 方法1: 使用#pragma ADDRESS #pragma ADDRESS TA0 0386H#pra
11、gma ADDRESS TABSR 0380H 建议将所有SFR地址声明放在一个文件里#include “mcu16c62.h”定义类型(根据其所占的内存大小)char TA0MR,TA0IC,TABSR;unsigned int TA0;特殊寄存器的操作 方法2:嵌入汇编语句asm()尤其是一些系统寄存器R0, FLG 方法3:定义成汇编子函数另写一个as30文件,将相关的操作封装成函数,供C程序调用 方法4:直接定义指针,并对该指针赋初值 BIT操作 使用位域BIT操作 使用宏#define SET_BIT(n,byteA) byteA |= (0 x01n); /* Set Bit =1 */#define CLR_BIT(n,byteA) byteA &= (0 x01n); /* Set Bit =0 */#define
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 十借款合同范例
- 房屋全款协议合同范例
- 天津滨海汽车工程职业学院《水墨艺术》2023-2024学年第一学期期末试卷
- 卡车维修合同范例
- 双方自愿离婚合同范例
- 消防隐患租房合同范例
- 档案仿真合同范例
- 医学心理伦理学测试题(附答案)
- 辐射安全考核核医学模考试题+答案
- 公司货款欠款合同范例
- 现代药物制剂与新药研发智慧树知到答案章节测试2023年苏州大学
- 肺结核的学习课件
- 心肺复苏术最新版
- 2023-2024学年贵州省贵阳市小学数学六年级上册期末自测提分卷
- GB/T 9115.2-2000凹凸面对焊钢制管法兰
- 永久避难硐室安装施工组织措施
- 元旦节前安全教育培训-教学课件
- 芯片工艺流程课件1
- 化工原理设计-苯-氯苯分离过程板式精馏塔设计
- 新教材人教A版高中数学选择性必修第一册全册教学课件
- IEC60335-1-2020中文版-家用和类似用途电器的安全第1部分:通用要求(中文翻译稿)
评论
0/150
提交评论