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

下载本文档

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

文档简介

1、 C 语言编程语言编程清华大学电子工程系2005年4月 单片机与嵌入式系统C 语言编程语言编程 特点:相对于汇编程序来讲结构化语言自动管理变量,支持复杂数据类型可读性和移植性好具有丰富的库函数执行时间稍长 趋势:使用C语言和汇编语言混合编程来开发单片机应用程序 C 程序若干问题程序若干问题 (1) 内存的分配 M30624FGFP的内存分RAM和ROM两个区。每个区定义了若干个SECTION。 RAM DATA data bss stack heap ROM CODE program ROMDATA rom vector fvector M30624FGFP 的内存配置 NC编译器对Secti

2、on的处理 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_FOIvectorfvectorROMDAT

3、ACODEprograminterruptprogram_S C 程序若干问题程序若干问题 (2) C程序结构可能包括多个asm文件, C文件 Startup文件 sect30.inc ncrt0.a30 汇编源文件 C源文件如何安排project的结构? Startup文件sect30.inc文件 ; fixed vector section .org0fffdcHNMI:.lworddummy_intRESET:.lwordstart.end Startup文件ncrt0.a30文件.glbstart.sectioninterruptstart:;-; after reset,this p

4、rogram will start;-ldc#istack_top, isp;set istack pointer 初始化程序的更改1. 注释掉不存在的段2. 最重要的三个段的位置设定.sectiondata_SE, DATA.org 400H.sectionrom_FE, ROMDATA.org 0C0000H.sectionvector, ROMDATA.orgVECTOR_ADR VECTOR_ADR .equ0FA000H其他的段就交给编译器来处理 例子:一个Section分配的结果 C 程序启动过程 主主C程序程序Void Init()Void Main()ncrt0.a30设定单片

5、机工作模式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 程序若干问题程序

6、若干问题 (3) 特殊的操作1. SFR寄存器的操作 方法1: 使用 # pragma ADDRESS # pragma ADDRESS TA0 0386h # pragma ADDRESS port4 03e8h 建议将所有SFR地址声明放在一个文件里 # include “mcu16c62.h”定义类型(根据其所占的内存大小) char TA0MR, TA0IC, TABSR; unsigned int TA0; 一个访问端口的例子 使用指针访问绝对地址 方法2:直接定义指针,并对该指针赋初值 char ptr; ptr = (char ) 0 x03e8; ptr = 0 xef; 后两

7、句也可合成一句 (char ) 0 x03e8 = 0 xef; 或使用宏定义 #define port ( (char )0 x03e8 ) port = 0 xef; 2. 位操作 使用 # pragma BIT 预处理命令 C 程序若干问题程序若干问题 (4) 中断程序处理 写一个中断处理函数需先作声明 #pragma INTERRUPT 中断函数名 中断处理函数必须是一个 void 类型函数 将这个中断处理函数添加进中断向量表 .glb _中断函数名 .lword _中断函数名 一个中断向量表的例子 C 程序若干问题程序若干问题 (5) 混合编程 在 C 语言中直接插入汇编语言一种是使

8、用 asm 关键字 用于直接改变标志和寄存器的值,如 asm ( “fset i”);另一种是使用 #pragma ASM 预处理命令 # pragma ASMFCLR IMOV.W # 0FFH, R0FSET I # pragma ENDASM C 语言中调用汇编语言子程序函数名定义规则 参数值传递规则(从C到汇编) 一种是通过寄存器和堆栈传递参数值从C到汇编传递参数的规则 另一种是采用 # pragma PARAMETER 预处理命令指定寄存器进行参数值的传递 用 pragma 命令进行参数值传递 C 语言中调用汇编语言子程序(续) 参数值传递规则(从汇编到 C) 汇编语言中调用C语言子

9、程序 开发工具的安装和使用开发工具的安装和使用 通过TM提供了集成化的开发环境 软件安装文件位于: TMV320_E.EXE TM集成环境 nc30wav500r1_e.exe 编译器 pd30simv500r1_e.exe PDSIM仿真软件 安装双击直接安装即可,安装目录为E:MTOOL演示 C project 以一个DMAC的例子来演示C编程的过程 TM软件的设置 建立一个新的Project 选择自定义的启动文件:ncrt0.a30 添加C源程序(C文件)到Project里面 编辑和修改C文件演示 C project (续) 设置编译参数 编译和检查错误 程序加载和连续运行 暂停和复位 观察程序执行情况:各种显示窗口 如何修改变量和寄存器的值 单步仿真 设置断点准备工作 源文件有三个在 E: mcusetup DMA目录中ncrt0.a

温馨提示

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

评论

0/150

提交评论