《单片机与嵌入式系统》C语言编程_第1页
《单片机与嵌入式系统》C语言编程_第2页
《单片机与嵌入式系统》C语言编程_第3页
《单片机与嵌入式系统》C语言编程_第4页
《单片机与嵌入式系统》C语言编程_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C语言编程清华大学电子工程系2005年4月

《单片机与嵌入式系统》C语言编程特点:相对于汇编程序来讲结构化语言自动管理变量,支持复杂数据类型可读性和移植性好具有丰富的库函数执行时间稍长趋势:使用C语言和汇编语言混合编程来开发单片机应用程序

C程序若干问题——(1)内存的分配

M30624FGFP的内存分RAM和ROM两个区。每个区定义了若干个SECTION。

RAM->DATA->data

bss

stack

heapROM->CODE->program ROMDATA->rom

vector

fvector

M30624FGFP的内存配置

NC编译器对Section的处理

Section的属性属性:I(是否初值),N/F(是否扩展区),

S(SB寻址区),E/O(偶地址对齐)举例:bss_SE,bss_NE,data_FE,data_SEI

data_SE

bss_SE data_SO bss_SO data_NE bss_NE data_NO bss_NO stack heap data_FE bss_FE data_FO data_FE

C程序中所有的section列表DATA

rom_NE rom_NO rom_FE rom_FO data_SEI data_SOI data_NEI data_NOI data_FEI data_FOI vector fvectorROMDATACODE program interrupt program_S

C程序若干问题——(2)C程序结构可能包括多个asm文件,C文件Startup文件sect30.incncrt0.a30汇编源文件C源文件如何安排project的结构?

Startup文件sect30.inc文件

……;fixedvectorsection .org 0fffdcH …… ……NMI: .lword dummy_intRESET: .lword start .end

Startup文件ncrt0.a30文件

…… .glb start .section interruptstart:;-------------------------------------------------------------------;afterreset,thisprogramwillstart;-------------------------------------------------------------------

ldc #istack_top, isp ;setistackpointer ……初始化程序的更改注释掉不存在的段最重要的三个段的位置设定

.section data_SE,DATA .org 400H .section rom_FE,ROMDATA .org 0C0000H .section vector,ROMDATA .org VECTOR_ADR VECTOR_ADR .equ 0FA000H

其他的段就交给编译器来处理例子:一个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)特殊的操作SFR寄存器的操作方法1:使用#pragmaADDRESS

#pragmaADDRESSTA00386h#pragmaADDRESSport403e8h……建议将所有SFR地址声明放在一个文件里

#include“mcu16c62.h”定义类型(根据其所占的内存大小)

charTA0MR,TA0IC,TABSR;unsignedintTA0;

一个访问端口的例子

使用指针访问绝对地址

方法2:直接定义指针,并对该指针赋初值

charptr;

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预处理命令#pragmaASM FCLR I MOV.W #0FFH,R0 FSET I #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(续)设置编译参数编译和检查错误程序加载和连续运行暂停和复位观察程序执行情况:各种显示窗口如何修改变量和寄存器的值单步仿真设置断点准备工作源文件

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论