《单片机与嵌入式系统》C语言编程

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

C语言编程清华大学电子工程系2005年4月《单片机与嵌入式系统》C语言编程•特点:相对于汇编程序来讲–结构化语言–自动管理变量,支持复杂数据类型–可读性和移植性好–具有丰富的库函数–执行时间稍长•趋势:使用C语言和汇编语言混合编程来开发单片机应用程序C程序若干问题——(1)内存的分配M30624FGFP的内存分RAM和ROM两个区。每个区定义了若干个SECTION。RAM-DATA-databssstackheapROM-CODE-programROMDATA-romvectorfvectorM30624FGFP的内存配置NC编译器对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_FEC程序中所有的section列表DATArom_NErom_NOrom_FErom_FOdata_SEIdata_SOIdata_NEIdata_NOIdata_FEIdata_FOIvectorfvectorROMDATACODEprograminterruptprogram_SC程序若干问题——(2)C程序结构•可能包括多个asm文件,C文件–Startup文件•sect30.inc•ncrt0.a30–汇编源文件–C源文件•如何安排project的结构?Startup文件sect30.inc文件……;fixedvectorsection.org0fffdcH…………NMI:.lworddummy_intRESET:.lwordstart.endStartup文件ncrt0.a30文件…….glbstart.sectioninterruptstart:;-------------------------------------------------------------------;afterreset,thisprogramwillstart;-------------------------------------------------------------------ldc#istack_top,isp;setistackpointer……初始化程序的更改1.注释掉不存在的段2.最重要的三个段的位置设定.sectiondata_SE,DATA.org400H.sectionrom_FE,ROMDATA.org0C0000H.sectionvector,ROMDATA.orgVECTOR_ADRVECTOR_ADR.equ0FA000H其他的段就交给编译器来处理例子:一个Section分配的结果C程序启动过程主C程序VoidInit(){……}VoidMain(){}ncrt0.a30设定单片机工作模式RAM清0变量初值设定堆初始化调用全局init子程序调用全局main子程序exit循环主C文件:init(){init1();init2();init3();……}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的层次图C程序若干问题——(3)特殊的操作1.SFR寄存器的操作方法1:使用#pragmaADDRESS#pragmaADDRESSTA00386h#pragmaADDRESSport403e8h……建议将所有SFR地址声明放在一个文件里#include“mcu16c62.h”定义类型(根据其所占的内存大小)charTA0MR,TA0IC,TABSR;unsignedintTA0;一个访问端口的例子使用指针访问绝对地址方法2:直接定义指针,并对该指针赋初值charptr;ptr=(char)0x03e8;ptr=0xef;后两句也可合成一句(char)0x03e8=0xef;或使用宏定义#defineport((char)0x03e8)port=0xef;2.位操作使用#pragmaBIT预处理命令C程序若干问题——(4)中断程序处理写一个中断处理函数需先作声明–#pragmaINTERRUPT中断函数名中断处理函数必须是一个void类型函数将这个中断处理函数添加进中断向量表–.glb_中断函数名–.lword_中断函数名一个中断向量表的例子C程序若干问题——(5)混合编程在C语言中直接插入汇编语言一种是使用asm关键字用于直接改变标志和寄存器的值,如asm(“fseti”);另一种是使用#pragmaASM预处理命令#pragmaASMFCLRIMOV.W#0FFH,R0FSETI#pragmaENDASMC语言中调用汇编语言子程序函数名定义规则参数值传递规则(从C到汇编)一种是通过寄存器和堆栈传递参数值从C到汇编传递参数的规则另一种是采用#pragmaPARAMETER预处理命令指定寄存器进行参数值的传递用pragma命令进行参数值传递C语言中调用汇编语言子程序(续)参数值传递规则(从汇编到C)汇编语言中调用C语言子程序开发工具的安装和使用•通过TM提供了集成化的开发环境•软件安装文件位于:TMV320_E.EXETM集成环境nc30wav500r1_e.exe编译器pd30simv500r1_e.exePDSIM仿真软件•安装双击直接安装即可,安装目录为E:\MTOOL演示-Cproject•以一个DMAC的例子来演示C编程的过程•TM软件的设置•建立一个新的Project•选择自定义的启动文件:ncrt0.a30注意:启动文件使用样本程序中提供的文件,不要用缺省程序•添加C源程序(C文件)到Project里面•编辑和修改C文件演示-Cproject(续)•设置编译参数•编译和检查错误•程序加载和连续运行•暂停和复位–观察程序执行情况:各种显示窗口–如何修改变量和寄存器的值•单步仿真•设置断点准备工作•源文件有三个在E:\mcusetup\DMA目录中ncrt0.a30sect30.incDMA1.c•Project保存路径在E盘根目录上自建工作目录:比如:E:\LU\DMA然后将三个源文件拷贝到该目录下面DMAC例子关于C语言编程更多内容请参考讲义:–ASM和C编程电子书.doc–6020easm.pdf电子文档–6020ec.pdf电子文档–教材P304

1 / 33
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功