欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    单片机C与汇编溷合编程.ppt

    • 资源ID:56694677       资源大小:239KB        全文页数:40页
    • 资源格式: PPT        下载积分:20金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要20金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    单片机C与汇编溷合编程.ppt

    单片机C与汇编溷合编程 Still waters run deep.流静水深流静水深,人静心深人静心深 Where there is life,there is hope。有生命必有希望。有生命必有希望Content程序的结构汇编程序C程序project框架如何改写汇编程序?在C程序中如何做一些底层操作?存储空间结构程序的结构汇编程序结构C程序结构M30624FGFP Memory Map几个主要的参数RAM区 ramTOPramENDROM区 progTOP Vvector汇编程序结构段类型RAM DATAROM CODE ROMDATA汇编程序结构 段定义.SECTIONmemory,DATA ;数据段.ORGVramTOP.SECTIONprog,CODE;代码段.ORGVprogTOP.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 告诉编译器使用该变量的指令寻址方式采用相对基址寻址方式,可以提高生成代码的效率。关于堆栈两种堆栈:堆栈指针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(扩展区)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.inc1.注释掉不存在的段2.最重要的三个段的位置设定.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 section.org0fffdchNMI:.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();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程序用层次化来保持整个组织结构的清晰如何改写汇编程序?目标:将他人提供的汇编程序转为可供自己在C程序中调用的子函数。例子:红外接收的子程序Step1大致看懂原程序完成了一个什么样的功能。主要的几个变量是什么含义。Step2分析自己的要求如果将该汇编程序独立出来作为一个子函数;那么其功能是什么?输入参数:有哪些返回值:有哪些我希望实现的功能等待接收一个字节,如果收到立刻返回该字节,没收到且时间超过300ms,那么也返回,同时指示状态为未接收。char recv_status=IR_RECV(char userID,char*pByte);指示接收状态 接收用户码 接收字节地址Step3对原来的程序进行裁减删去原有的各个段定义重新定义各个Section:bss_SE,rom_FE,program定义和声明全局子函数_IRR_INIT_IR_RECVI_timera0涉及C和汇编子程序之间的参数传递(详见下文)删除不必要的变量和程序如果使用中断,则将中断向量表设置挪至sect30.inc最后以.end结束文件C和汇编子程序之间的参数传递参数规则(从C到汇编)参数规则(从汇编返回到C)函数名定义规则参数规则(从C到汇编)采用#pragma PARAMETER参数规则(从汇编到C)函数名定义规则最后结果C程序部分:extern char IR_RECV(char,char*);#pragma PARAMETER IR_RECV(R0L,A0)汇编语言部分:.glb _IR_RECV;全局调用声明_IR_RECV:mov.b R0L,N_CSTM;参数传递:用户码mov.w A0,SAVE_ADDR;参数传递:接收结果地址 mov.b#1,R0L;返回1,如果收到了数据 改写汇编程序小结看懂源程序在明白自己所需要的功能后,再进行修改有的时候还是需要改多一些地方。该例子存放到ftp:/166.111.172.7在C程序中如何做一些底层操作特殊寄存器的操作BIT操作特殊寄存器的操作方法1:使用#pragma ADDRESS#pragma ADDRESS TA0 0386H#pragma 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 TST_BIT(n,byteA)(byteA&(0 x01 HEAPSIZE malloc,allot,.如果用了,则Heapsize够不够。没用,。注释掉,节约资源。B.堆栈的大小够否?-STACKSIZE,ISTACKSIZE 可直接用Stack Calulate(TM工具栏上)查看这两个参数的设定都在ncrt0.a30中

    注意事项

    本文(单片机C与汇编溷合编程.ppt)为本站会员(豆****)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开