




已阅读5页,还剩214页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
,transition title,codewarrior使用指南,田云锋 汽车电子 现场应用工程师 2005年6月 r63492,slide 2,内容,codewarrior简介 利用向导创建一个新工程项目 在新项目中加入或删除文件 编译 调试 启动程序 prm文件设置 如何对io及寄存器进行操作 如何写中断程序 如何使用汇编和c语言混合编程 嵌入式编程注意事项 如何使用processor expert,slide 3,项目创建,project creation important choices are made (derivative, language, targets used for the development) usually difficult to change any of these once the project is started codewarrior solution: project wizard intuitive menu to guide the developer through the selection process, choice of the derivative, choice of the language (absolute assembly, assembly, c, c with processor expert, c+) choice of target (simulator, various hardware connections) other options (pc-lint, board support packages) complete project template prepared with files, developer can just “insert the code here”,project creation,h/w specific code generation,application specific code development,test / debug & validation,h/w s/w integration,project wizard derivative language targets,slide 4,hardware specific code,hardware specific code generation developers have to understand the details of peripheral registers, bit fields, setup and access sequences trend is for more and complex peripherals, with more registers, increasing the effort of writing accurate code for each peripheral of the derivative. but there is no added value from a project stand point, all applications need some from of code to perform the function,project creation,h/w specific code generation,application specific code development,test / debug & validation,h/w s/w integration,processor expert,derivatives knowledge database,codewarrior solution: processor expert - application design tool using knowledge database, - graphical selection of peripheral parameters, - auto-generation of low-level drivers, - high-level beans available, - makes the users manual easy.,slide 5,application specific code,application specific code development need a user-friendly editor, be able to develop absolute assembly code, need an efficient compiler (code size, speed) codewarrior solution: ide, editor, assembler, compiler, linker ide with utilities such as file compare, project settings, target settings multi-pane color coded editor, go to code definition, go to procedures definition absolute assembler and reallocateable assembler compiler with 50+ optimizations linker with editable parameters projects that change often or have multiple developers.,project creation,h/w specific code generation,application specific code development,test / debug & validation,h/w s/w integration,editor,compiler,assembler,linker,slide 6,test, debug and validation,test, debug and validation without simulator, it is impossible to test software until hardware is available, developers have to make up for delays at the critical stage, reducing testing, integration and quality, improved code validation will reduce product maintenance, reduce “end of project” costs. codewarrior solution: ide, debugger and simulator, data visualization, i/o stimulation,project creation,h/w specific code generation,application specific code development,test / debug & validation,h/w s/w integration,debugger multi-target interface,simulator,data visualization,i/o stimulation,rtos awareness,project manager allowing target specific files selection and system settings fully configurable debugger, instruction set accurate simulator, i/o simulation data visualization (direct, command files) i/o stimulation (direct, command files) rtos awareness (e.g. osek),slide 7,hardware and software integration,hardware and software integration without simulation, developers risk of getting h/w and s/w problems mixed up (none has been qualified yet), developers have difficulties to compare a working case (simulation) with a non-working case (hardware target), codewarrior solution: same as previous slide plus: easily switch between targets for comparison of results data visualization and i/o stimulation (simulation and targets) flash programming support rtos awareness (e.g. osek) foreign target capability through api,project creation,h/w specific code generation,application specific code development,test / debug & validation,h/w s/w integration,debugger multi-target interface,simulator,multilink,data visualization,i/o stimulation,rtos awareness,usb (e.g. indart),api,利用向导创建一个新工程项目 在新项目中加入或删除文件 编译 调试 启动程序 prm文件设置 如何对io及寄存器进行操作 如何写中断程序 如何使用汇编和c语言混合编程 嵌入式编程注意事项 如何使用processor expert,slide 9,创建新工程 1,1、创建新工程,3、输入工程名,2、选择hcs12 new project wizard,slide 10,创建新工程 2,4、选择mcu类型,5、选择语言类型,slide 11,创建新工程 3,6、选择是否采用processor expert,7、选择是否使用pc-lint,如果用processor expert,选择 yes,slide 12,创建新工程 4,8、选择是否用浮点运算,9、选择存储器类型,slide 13,创建新工程 5,10、选择调试器类型,slide 14,源程序文件夹,start up文件夹,prm文件夹,map文件夹,库文件夹,代码长度,变量长度,是否被包含在target中,是否产生调试信息,列出相关文件,编译,调试,slide 15,参考文献, codewarrior manuals/pdf/ied_users_guide.pdf,利用向导创建一个新工程项目 在新项目中加入或删除文件 编译 调试 启动程序 prm文件设置 如何对io及寄存器进行操作 如何写中断程序 如何使用汇编和c语言混合编程 嵌入式编程注意事项 如何使用processor expert,slide 17,在新项目中加入或删除文件,点击右键,加入或从此工程中删除文件,新建一文件,并保存到原文件夹中,如果编译时,出现没有调试信息警告,请点击这里,利用向导创建一个新工程项目 在新项目中加入或删除文件 编译 调试 启动程序 prm文件设置 如何对io及寄存器进行操作 如何写中断程序 如何使用汇编和c语言混合编程 嵌入式编程注意事项 如何使用processor expert,slide 19,无限循环,while (1); for (;); loop: goto loop;,对嵌入式系统来说: 循环是必须要用到的. 上述3种方式, 第2种更好一些 为什么?,因为它不会产生警告信息 “always true warning”,slide 20,编译器优化,codewarrior编译器提供了几种从c源代码产生实际汇编代码的优化方法,这些代码被下载到微控制器中 全局优化设置面板设定编译器怎样优化目标代码。所有优化程序重新组织目标代码,不影响其逻辑执行顺序。,slide 21,编译器优化 强度减弱,“strength reduction”(强度减弱)是一种优化,力争用开销小的操作代替开销大的操作,所要付出的代价是执行时间或代码大小。 在循环内,用加法指令代替乘法指令。 下列例子将演示编译器,根据具体应用,来决定哪一种操作用最少代价达到同样结果。,slide 22,这个变量乘以3,slide 23,用乘法来实现,slide 24,变量乘以4,slide 25,用 2 次左移位来实现. 用h:x作为指针来指向我们想要乘的值,slide 26,这句话等同于 vara = vara * 4;,slide 27,编译器优化 死代码消除,死代码消除就是编译器在优化应用程序时,对没被使用的语句将不产生可执行代码 去除逻辑上从未执行的语句或没有被其他语句提到的语句,slide 28,slide 29,slide 30,slide 31,编译器优化消除死赋值,消除死赋值就是指编译器移去变量在再次赋值之前没有被使用的赋值 在下面编译器优化的例子,我们将演示通过改变编译器的优化设置,达到改变codewarrior产生代码的方式。,slide 32,slide 33,slide 34,codewarrior hc08 compiler options settings,slide 35,所有的代码将被忽略,slide 36,在循环中用到的变量定义成全局变量,slide 37,这段代码并没有忽略掉,因为它是全局变量,有可能会被硬件(中断)用到,slide 38,在循环内复制代码,目的是展开分支操作 下面的例子演示一下循环解开是如何工作的:,编译器优化 循环解开,通过改变编译器设置,我们可选择不同的优化项,在生成代码时将会有差异,slide 39,示例(没有循环解开):,编译器产生与4次循环相关的代码。,slide 40,示例(有循环解开):,相同的代码,但改变设置为“loop unrolling”,编译器产生如下代码。,相当于把循环展开 for ( i = 0; i 4; j+ ) array i = i; -array 0 = 0; array 1 = 1; array 2 = 2; array 3 = 3;,slide 41,更多的优化选项:,slide 42,更多的优化选项: :,slide 43,条件编译,编译指示符:#if、#else、#elif、#endif 这些指示符均用于条件编译: #if #else or #elif #endif 只有当条件表达式的值不为零时,才编译跟有#if指示符的行。否则以后的行都被跳过直到遇到匹配的#else或endif。 #error定义一个用于显示的编译错误。,slide 44,对于嵌入式系统: 同一源代码支持多平台; 源代码的适应性(在编译时设置),利用向导创建一个新工程项目 在新项目中加入或删除文件 编译 调试 启动程序 prm文件设置 如何对io及寄存器进行操作 如何写中断程序 如何使用汇编和c语言混合编程 嵌入式编程注意事项 如何使用processor expert,slide 46,模拟调试器界面,工具条,slide 47,模拟调试器: 特点,功能强大的图形界面 (拖&拉操作, 弹出式菜单.). 模块化和可扩展系统(基于组件概念). 不同的组件可以加入: 来自metrowerks(codewarrior)公司的组建 来自半导体公司的组件 用户组件 对所有的目标和目标接口,界面(gui)完全相同,slide 48,模拟调试器: 界面,对不同的simulator和debugger,界面完全相同。对所有的cpu,界面完全相同。仅仅是子窗口中的内容不同。,slide 49,模拟调试器: 界面,断点信息,汇编指令地址,汇编指令机器码,汇编指令,profiling 信息 (代码所花时间百分比),源代码,高级语言展开/折叠命令,覆盖信息,slide 50,模拟调试器: 界面,cpu 寄存器,存储区地址,存储区中的内容,存储区中的内容(字符),slide 51,模拟调试器: 界面,执行的函数,目标类型,目标列表,利用向导创建一个新工程项目 在新项目中加入或删除文件 编译 调试 启动程序 prm文件设置 如何对io及寄存器进行操作 如何写中断程序 如何使用汇编和c语言混合编程 嵌入式编程注意事项 如何使用processor expert,slide 53,启动程序,startup code一般用汇编语言写的,并且会连接到你编译过的可执行的模块中. 它为执行c语言写的程序做准备:,关闭中断 把初始化过的数据从rom中拷贝到ram中 将未初始化数据区清零 给堆栈分配空间并初始化 创建并初始化堆 开放中断 调用main(),slide 54,slide 55,复位后第一个执行的是启动程序,复位向量存贮了_startup()所在位置,利用向导创建一个新工程项目 在新项目中加入或删除文件 编译 调试 启动程序 prm文件设置 如何对io及寄存器进行操作 如何写中断程序 如何使用汇编和c语言混合编程 嵌入式编程注意事项 如何使用processor expert,slide 57,代码放在哪里?,在*.prm文件中,sections命令块用于定义存贮器的物理区域。 在sections命令块中,每个单独的物理存贮器段用一个名字、一个属性和一个地址范围描述 placement命令块用于将代码和数据段定位到存贮器段,/dl_hc08.htm,“codewarrior manualspdfmanual_smartlinker.pdf” c:program filesmetrowerkscw08 v3.1technical notesbuildtoolstn04.pdf,slide 58,#pragma,slide 59,存储区分配,slide 60,代码放在哪里?,变量放在default_ram 的位置,除非另外规定一个pragma声明 频繁使用的变量应放在直接页ram ($40 -$ff) 在直接页中访问操作数采用直接寻址模式(8位寻址模式)比扩展寻址模式(16位寻址模式)少一个时钟周期,slide 61,数据段 (vara) 想存放在一个特定区域内 (0x0080-0x00a9),slide 62,slide 63,slide 64,funcition1 被放在 functionsrom代码段中 ,其地址为 0xef00 到 efff,slide 65,常数段想存放在特定的位置,slide 66,slide 67,slide 68,数组存在我们期望的位置,利用向导创建一个新工程项目 在新项目中加入或删除文件 编译 调试 启动程序 prm文件设置 如何对io及寄存器进行操作 如何写中断程序 如何使用汇编和c语言混合编程 嵌入式编程注意事项 如何使用processor expert,slide 70,如何对io进行操作?,利用codewarrior头文件中已经定义好的io寄存器 或者: #define porta ( * ( volatile unsigned char * ) 0x0000 ) 或者 volatile unsigned char porta 0x0000;,slide 71,访问固定内存位置,嵌入式系统通常的特点是需要编程者访问一个指定的存贮器位置。 练习:在某个项目中需要将绝对地址0xffa处整型变量的值设为0xaa55(编译器为纯粹的ansi编译器)。完成这个任务的代码是:,int * ptr; ptr = (int *)0x2ffa; *ptr = 0xaa55;,slide 72,访问cpu寄存器,cpu中的寄存器没有对应的固定地址 可以用汇编指令对它们进行访问 c语言无法直接访问这些寄存器 c编译器允许在c代码中使用汇编指令,1)_asm assemblyinstuction; 2)asm (assemblyinstruction); 3)asm - - ,slide 73,修改cpu中ccr寄存器的i位,slide 74,利用汇编指令来修改 i 位,slide 75,位域,位结构 效率随编译器的不同而改变; 不同的编译器不能移植。 位类型 无法移植 提高代码效率 移位和屏蔽 可移植,合理提高效率 经常被优化成位操作,slide 76,联合体是一个变量,不同的时间表示不同的类型和大小的对象,编译器会根据要求决定变量的大小。,slide 77,联合体提供一种可以对单一存贮区不同类型数据操作的方法,程序中没有嵌入任何依赖于机器的信息,利用向导创建一个新工程项目 在新项目中加入或删除文件 编译 调试 启动程序 prm文件设置 如何对io及寄存器进行操作 如何写中断程序 如何使用汇编和c语言混合编程 嵌入式编程注意事项 如何使用processor expert,slide 79,codewarrior 编译器提供了一种非ansi标准的方式来实现中断:,中断向量表分配 mcu 数据手册,在 c 源文件中,中断服务程序前面加 “interrupt 中断向量号”,int time_counter; interrupt 7 int_timer(void) time_counter +; ,方法1:利用关键字 interrupt:,slide 80,中断向量表分配 mcu 数据手册,slide 81,方法2:在prm文件中声明,在prm文件中声明,在c代码中写中断服务程序,#pragma trap_proc void inccount(void) int card1; tcount+; ,在 prm 文件中,将中断服务程序名和中断向量地址对应,vector address 0xfff0 inccount,slide 82,方法3:在向量表中初始化,slide 83,利用interrupt关键字声明中断服务程序,slide 84,利用向导创建一个新工程项目 在新项目中加入或删除文件 编译 调试 启动程序 prm文件设置 如何对io及寄存器进行操作 如何写中断程序 如何使用汇编和c语言混合编程 嵌入式编程注意事项 如何使用processor expert,slide 86,如何使用汇编和c语言混合编程,汇编和c语言中使用相同的符号(变量及函数名) 注意参数传递规则 注意函数返回值原则 注意目标文件格式 (elf-dwarf or hiware). 接口模块(c/assembly) 或 (assembly/c),slide 87,在c中访问汇编变量,slide 88,在汇编中访问c变量,slide 89,在c中调用汇编函数,slide 90,在汇编中调用c函数,函数(c代码中),void addvar(unsigned int first, unsigned int second) asmdata = cdata + first + second; ,函数声明 (汇编),xref addvar,在汇编中调用c函数,ldd cdata ; load value of cdata in d pshd ; push d on the stack ldab #10 ; load 10 in d clra jsr addvar,利用向导创建一个新工程项目 在新项目中加入或删除文件 编译 调试 启动程序 prm文件设置 如何对io及寄存器进行操作 如何写中断程序 如何使用汇编和c语言混合编程 嵌入式编程注意事项 如何使用processor expert,slide 92,嵌入式编程 vs. pc编程,嵌入式编程环境的主要特点: 有限的ram; 有限的rom; 有限的栈空间; 面向硬件编程; 严格的定时(isr,任务,); 很多不同种类的指针(far/near/rom/uni/paged/); 特殊关键字/标识符(,interrupt,tiny,),slide 93,数据类型,通过为变量选择最合适的数据类型可以最大程度地得到最短的代码和执行时间 8位微控制器内部的数据的长度是8位(一字节),然而c首选的数据类型是int 8位机处理8位数据类型比16位数据类型效率更高 “int“和大数据类型只有当所描述的数据的大小需要时才使用 当优先考虑代码效率时,双精度和浮点操作效率低,应当避免,slide 94,hc08的数据类型,ansi标准没有精确定义数据类型的大小,但是 codewarrior 定义了.,0,255,slide 95,默认codewarrior 的数据类型,所有的基本数据类型可以被改变 但是建议尽量使用默认值,slide 96,数据类型选择,对8位mcu, 在选择数据类型时,有3条原则: 尽量使用最小的数据类型 尽可能使用无符号数 在表达式内声明数据类型,以便将数据类型减小到最小(强制类型转换),使用typedefs得到固定的大小 - 根据编译器和系统而改变 - 移植到不同的机器代码不变 - 当值需要固定位时使用,slide 97,定义完整的数据类型,在main函数里声明了3种不同数据类型的变量,slide 98,仅最后面的位写入值; 并且使用了一个寄存器,每个变量的其余位被清零 clr ,x,变量在堆栈里有一个地址,slide 99,在main函数里声明了3种不同数据类型的变量,slide 100,slide 101,所有声明的全局变量均被使用。,slide 102,在这种情况下,编译器为所有变量保留了内存,slide 103,变量声明的内存区,每个变量有不同的大小(1、2和4字节),根据变量大小的不同,每个加操作用不同的方法完成,slide 104,修饰符,以下关键字用于声明变量,以指定特定需要或内存中变量存贮的相关条件。 static volatile const 这三个关键字,一起让我们不仅可写出好的代码,而且可写出紧凑的代码,slide 105,静态变量,使用静态变量有二个主要功能: 第一个最常用的用法是定义一个变量,在函数连续调用期间,变量不会消失。 第二个使用静态的用法是限制变量的范围。在模块级定义时,能被整个模块中所有函数访问,不能被其它模块中的函数访问,slide 106,静态变量示例,file1.c #include /includes functions contained in file /file2.c void main (void) myfunction(); /included in file2.c myfunction(); /included in file2.c ,file2.c void myfunction (void) /definition of myfunction in file2.c static char myvar = 0; /local variable declared static myvar = myvar + 1; ,slide 107,静态函数,静态函数只能被其所在模块中的其它函数调用 使用静态函数是结构化编程的好习惯 静态函数能产生小而快的代码 编译器在编译时确切地知道什么函数能调用一个给定的静态函数。因此,函数的相关内存区域能被调整,以致使用调用的一个短版本或跳转指令,slide 108,volatile变量,在嵌入式系统中,这种情况通过两种主要途径发生: 通过一个中断服务程序 硬件动作的结果 例如,通过一个串口接收到一个字符,结果串口状态寄存器更新,这完全在程序流程之外发生。很多程序员知道编译器不会试图优化一个volatile寄存器,而宁可每次重载它,volatile变量其值在正常程序流程以外可能改变的变量,slide 109,volatile的变量从不会被编译器优化,访问定义为volatile的变量从不会被编译器优化,volatile unsigned char porta 0x00; volatile unsigned char scs1 0x16; unsigned char value; void main(void) porta = 0x05; /* porta = 00000101 */ porta = 0x05; /* porta = 00000101 */ scs1; value = 10; ,slide 110,volatile 变量示例,/* mc68hc908gp20/32 official peripheral register names */ volatile unsigned char porta 0x0000; /* ports and data direction */ volatile unsigned char portb 0x0001; volatile unsigned char portc 0x0002; volatile unsigned char portd 0x0003; volatile unsigned char porte 0x0008; volatile unsigned char ddra 0x0004; /* data direction registers */ volatile unsigned char ddrb 0x0005; volatile unsigned char ddrc 0x0006; volatile unsigned char ddrd 0x0007; volatile unsigned char ddre 0x000c; volatile unsigned char ptapue 0x000d; /* port pull-up enables */ volatile unsigned char ptcpue 0x000e; volatile unsigned char ptdpue 0x000f;,slide 111,const 变量,const声明可用于任何变量,它告诉编译器将其存贮在rom区中 编译器保留了那个位置程序存贮器地址。由于位于rom中,其值不能改变 cons变量必须初始化 比如: const double pi = 3.14159265;,slide 112,const修饰符,const 变量与明显的常数相对,很多文章要求用const变量代替明显的常数。例如: 用const unsigned char channels = 8;代替#define channels 8 。 本方法的基本原理是在调试器内部,你能检查一个const变量,然而一个明显的常数不可访问。不幸的是,在很多8位机上你将为这一好处付出极大的代价。这两个主要代价是: 一些编译器在ram中创建一个真实的变量来支持cost变量,这是一个极大的惩罚。 一些编译器如codewarrior,知道变量为const,将把变量存贮在rom中。无论怎样,变量仍作为变量处理和访问,典型地用某些变址寻址(16位)的方式。与直接寻址(8位)方式相比,这种方法通常很慢。,slide 113,const volatile 变量,一个变量既能是常量,又能是可变量吗? 答案是“能”。 这个修饰符应该用于能出乎意料地改变的任何存贮器位置,因此需要volatile限定语,由于const该变量是只读的。 最明显的例子是硬件状态寄存器,象sci状态寄存器scs1。这个寄存器包含信号状态标志,如发送空、发送完成、接收满以及其它。这是一个可变寄存器由于这些标志的改变依赖于串行通信的状态,这也是只读,由于标志不能被程序直接改写,它们只对模块的状态作出响应。这个状态寄存器最佳声明方法是: /* sci status register */ const volatile unsigned char scs1 0x0016,slide 114,栈指针与函数参数,栈指针支持c的关键特性: 在汇编程序和c编译器中,堆栈通常用于给子程序传递变量; 允许使用递归; 是自动变量的基础。 典型地子程序将把需要的操作数放入累加器。堆栈相对寻址允许访问堆栈上的数据,提供直接访问操作数。 排除从堆栈压入以及弹出数值所需要的代码和时间,堆栈指针指令与等份的变址指令相比需要一个额外的字节和一个额外的执行周期。,typedef struct unsigned char id; unsigned short time; objecttype; void foo (unsigned char value) volatile objecttype instance; instance.id = value; ,slide 115,堆栈指针寻址,堆栈指针相对寻址进一步增强了c代码的效率。 有两种类型: 8位偏移的堆栈指针相对寻址 16位偏移的堆栈指针相对寻址 它们和间接寻址方式工作相似,但使用堆栈指针代替h:x变址寄存器。 注意当中断不允许时可用堆栈指针作为额外的变址寄存器。,slide 116,堆栈帧,帧指针 函数通常有一个包含其所有本地数据的堆栈帧。编译器并不设置一个明白的帧指针,但堆栈上的本地数据和参数都根据sp寄存器访问。 入口代码 通常入口代码是一系列为本地变量保留空间的指令: psha ;仅当有寄存器参数 pshx ;仅当有寄存器参数 ais #(-s) ;为本地变量保留空间 s是函数的本地数据的大小(单位:字节) 出口代码 出口代码从堆栈中移除本地变量,并返回到调用者: ais #(t) ;移除本地栈空间,包括最终的寄存器参数 rts ;返回调用者,slide 117,除函数返回一对象大于二字节,函数结果都返回到寄存器中。依据返回类型,使用不同的寄存器。如下表所示: 返回大对象: 函数返回大于二字节的对象均与一个附加的参数一起调用,它被传到h:x。这个参数是对象应复制到的地址。,hc08返回值,slide 118,声明了四个不同类型的函数,每个函数返回一不同类型的变量,每个函数有一个不同类型的参数(void,byte,word),slide 119,被调用的函数跳转到其源码所在的地址,函数返回用 rts指令,slide 120,参数在寄存器a中,slide 121,slide 122,a用作参数寄存器,也用作直接寻址数组中的字节,slide 123,函数指针,函数指针与数据指针一样有用处: 当你想用一个间接访问 当你想用同一段代码,根据环境的不同调用不同的函数,slide 124,定义指向函数的指针,下面的代码定义了一个指向函数的指针,带了一个整型参数并返回一整数: int (*function)(int); (*function) 括号是必须的,因为定义中的优先关系。 没有括号,则表示定义了一个函数返回一个整型指针,slide 125,example:,pf 是一个静态函数指针,int是参数,返回值为void void fna(int); /example prototype of a function to be called typedef void (* const pfv_i)(int); /declaration using typedef static pfv_i pf =fna, foo2, foo3, foo4); /direct declaration static void (* const pf)(int) = fna, foo2, foo3, foo4; /example use int a = 6; pfjump_index(a); /calling method 1 (*pfjump_index)(a); /calling method 2,slide 126,example:,函数指针初始化,现在函数指针指向另一个函数,周期性中断毁调用函数指针指向的函数,slide 127,hc08ql 示例,slic 模块仅有一个中断 用户必须读取状态向量寄存器slic state vector register (slcsv)来确定中断源 可能 c 代码: switch-case nested ifs(if嵌套) pointers to functions(函数指针),slide 128,slide 129,debug (1):,slide 130,debug(2):,slide 131,debug(3),slide 132,when to use pointers:,if 嵌套可读性好,当使用函数少时,代码较小 switch 可读性最好,代码最大 pointers 函数越多,产生的代码少,但是ram使用的最多,使用指针执行时间相同,slide 133,访问数组,硬编码: array0=12*unit_volts; 编译时决定地址,执行速度快 变址增加 arrayindex+=12*unit_volts; 快速,比硬编码灵活 数组指针 *(arrayptr+)=12*unit_volts; 执行速度快,可读性差,可和循环一起使用,slide 134,slide 135,每种访问类型都有各自的优点,使用不同的寄存器完成不同的操作,slide 136,封装变量和函数,slide 137,接口文件 (头文件),仅在这个文件中使用的变量,修饰符 extern,仅在这个文件中使用的函数,可以完全成为一个大工程里的经过测试的模块,使软件模块化。,slide 138,“通讯” 在main.c 和 functions.c,slide 139,变量 result 在main中被声明,slide 140,在 function.c中使用的变量,slide 141,slide 142,result存储在全局变量中,利用向导创建一个新工程项目 在新项目中加入或删除文件 编译 调试 启动程序 prm文件设置 如何对io及寄存器进行操作 如何写中断程序 如何使用汇编和c语言混合编程 嵌入式编程注意事项 如何使用processor expert,slide 144,processor expert处理器专家,为什么要用处理器专家 其步骤请转到第一页,slide 145,开发人员面临的挑战,要处理的外设越来越多 外设越来越复杂 开发周期要求越来越短 越来越长的代码需要更多的时间来开发,测试 市场竞争越来越激烈,性能要求越来越高 应用中队创新的追求 这些要求往往很难同时满足,开发人员必须 做出艰难的选择。 他们需要高性能的工具来帮助他们。 codewarrior development studio及processor expert处理器专家给工程师提供了巨大的帮助,slide 146,嵌入式应用系统设计,工程师面临的挑战 越来越多的功能 通讯外设 a/d 和 d/a 转换 pwm, timers i/o,slide 147,嵌入式应用系统设计 (2),asci, i2c, espi can, bdlc, usb, ethernet 缩短产品上市时间 市场竞争 市场需求,slide 148,项目开发的主要难点,外设的选择和使用 需要用到很多外设 i/o, 字节操作, 位操作 a/d 和 d/a 转换 输入捕捉, 输出比较,pwm 通讯控制器,slide 149,项目开发的主要难点(2),设计初始化流程 设计外设的使用 (打开,读,写,关闭) 芯片和应用的底层开发 每个外设的特点 每个模块的特点,slide 150,怎样迎接挑战,传统方式 阅读数据手册(上百页的数据手册) 理解寄存器的含义 外设有很多寄存器,每个位的定义,功能 理解各种不同的组合 晶振,pll,预分频,波特率设置 评估所有的选项 唤醒模式,8-9-10 位模式, 左/右对齐, 上升沿/下降沿 注意相互影响 8个8-bit模块,4个16-bit模块, 缓冲寄存器 理解多功能复用 普通i/o引脚和其他模块复用,slide 151,阅读上百页的资料,slide 152,问题和风险,需要时间来阅读和理解手册 对资料可能存在误解 新功能 手册错误,或描述不清 功能重复使用 比如 can 模块和 pwm 模块共用io引脚 编程错误 位操作时置位和清零颠倒 顺序错误 寄存器访问顺序错误,或访问的时间有误,slide 153,开发过程中遇到的困难,开发后期发现错误 重新入阅读数据手册 返回到项目的最初阶段(浪费时间) 重新理解文档 更加困难,对以前的理解需要更正 怀疑文档,怀疑芯片错误 假设理解正确的情况下,修改程序 重新修改程序,有可能会遇到以上同样的问题 花费大量的时间,slide 154,开发过程中遇到的问题 (2),累加的影响 继续重复测试 继续对没有任何增值的代码进行测试 应用程序没有测试,还需要软硬件集成 开发时间重复浪费,硬件开发,应用程序开发,软硬件集成,项目开始,产品发布,slide 155,正确迎接挑战,采用处理器专家 针对数据手册的知识库 处理器专家包括了微处理器的功能, 特性, 选项 隐藏的寄存器 寄存器隐藏起来,用相应的选项来代替 组合和交互自动计算 振荡器, pll, 预分频, 时钟因子, 波特率产生器自动地被计算 可能的值/设置用简单的单位列出来 手动输入值会被检查,如果无法完成则做标记 检测引脚复用 外设使用共用引脚引起的冲突会做标记,在生成代码之前需要解决这个问题 处理器专家会跟踪已经使用过的资源,slide 156,processor expert处理器专家,面向对象的应用开发工具减少
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度智能设备安装与销售一体化服务合同范本
- 2025年度农业科技成果转化与应用推广合同
- 2025年新型城镇化建设中电缆敷设施工及售后服务合同
- 2025年度航天科技咨询服务合同
- 2025年度新型生态挡土墙施工劳务合同模板
- 2025保密协议培训与知识产权战略规划合同
- 2025二手房暂不过户房屋租赁与转租合同范本
- 2025版商厅出租合同附租金递增条款
- 2025贷款合同范本旅游产业开发贷款合作
- 2025版实习岗位需求实习合同范本
- 2025年残联招聘笔试大纲解读与备考指南
- 2025版厂房装修施工安全责任合同模板
- GB 16808-2025可燃气体报警控制器
- 医疗机构重点部门感染预防与控制标准WST860-2025解读宣贯
- 气体灭火系统日常维护管理手册
- 2025年汽车后市场行业当前市场规模及未来五到十年发展趋势报告
- 德育副校长工作总结课件
- 业财一体化课件
- 2025年安管人员继续教育试题及答案
- 超声弹性成像技术规范
- 钢材冷弯项目投资可行性研究分析报告(2024-2030版)
评论
0/150
提交评论