第5章 嵌入式C语言程序设计基础ppt课件
- 格式:ppt
- 大小:550.00 KB
- 文档页数:119
嵌入式C语言程序设计基础课后习题答案第一章一CAC二1用于告诉编译器在程序中包含标准输入\输出库信息2程序=数据结构+算法3算法即操作步骤,它指明了解决某一问题的方法和步骤4自然语言\流程图\N-S图三1、自然语言(略)N-S图传统流程图2、#pragma SMALL#include <at89x51.h>void main(void){ int i;P0 = 0x15;for(i=0;i<1000;i++);}3、略一DAD二1、负责接收\处理和执行指令的发出2、可以避免程序运行时进入混乱和死循环三1、L298N的驱动电路采用双极型H桥型脉宽调制(PWM)工作方式,输入信号为标准TTL逻辑电平信号,内部包含四通道逻辑驱动电路,可组成两个H桥式驱动器,驱动两只电机。
2、略3、#pragma SMALL#include <at89x51.h>void main(void){ int i;P0 = 0x16;for(i=0;i<1000;i++);}一DDCAB BDBAB BC二1int float char2十进制八进制十六进制小数指数3下划线字母数字字母或者下划线4‘’ “”5% *=6实型整型字符型7 18 19data11 x%k)-(k%(x%k))12 113321446150 1 016 2.5三1、 ‘a’表示单个字符,在其中必须且只能有一个字符。
"a"表示字符串,字符串是由若干个字符组成的。
字符是组成字符串的元素。
2、是3、int x = 10, y = 12;int temp;temp = x;x = y;y = temp;4、#pragma SMALL#include <at89x51.h>void delay1(int data a1){ unsigned int data i,j;for(i=0;i<a1;i++)for(j=0;j< 122;j++) {}}void fd(unsigned int data b){ unsigned int data i;for(i=0;i<b;i++){ P0 |= 0x15;delay1(5);P0 &= 0x00;delay1(1);}}void lt(unsigned int data b) { unsigned int data i;for(i=0;i<b;i++){ P0 |= 0x16;delay1(5);P0 &= 0x00;delay1(1);}}void tz(unsigned int data b) { unsigned int i;(i=0;i<b;i++) for{ P0 &= 0x00;delay1(1000);}}void main(void){ fd(500);lt(300);fd(500);lt(300);fd(500);lt(300);fd(500);lt(300);tz(1000);}第四章习题答案一Bcbbb dbabd bcdba二1、{}2、10,9,113、8,174、115、8,206、for7、48、while do…..while for9、4.010、111、012、do….while13、1,2,1三1、switch(s){case1:case7:case8:x=1;break;case2:case9:case10:x=3;break;case3:case4:case5:case6:x=2;break;default:x=0;}2、#include<stdio.h> main(){int i=1,j=1;long int s,sum=0;for(j=1;j<=20;j++){ s=1;for(i=1;i<=j;i++){ s*=i;}sum+=s;}printf("1+2!+...+20!=%ld\n",sum); }3、#include <stdio.h>void main(){int n;for (n=100;n<=200;n++){if (n%3==0) continue;printf("%d ″,n);}}4、#include "stdio.h"#include "conio.h"main(){ int i,j,k;for(i=0;i<=20;i++){ for(j=0;j<=33;j++){ k=100-i-j;if(i*15+j*9+k==300)printf("\n鸡翁鸡母鸡雏数分别为:%5d%5d%5d",i,j,k); } }getch(); }第5章答案DADDA BBBCC BABAA BBAD1嵌套递归2return void3自动变量和寄存器变量、静态外部变量、静态局部变量和外部变量4void dothat(int n,double x);5extern6定义时赋值和运行时赋值7void8auto9函数、语句10值传递\址传递11\全局和局部动态和静态三1、#include<stdio.h>int fun(int n){int i,sum=0,f=1;for(i=1;i<=n;i++){sum+=(f*i);f=-f;}return sum;}int main(){int n=10;printf("%d\n",fun(n));}2、#include <stdio.h>double sum(double x, int n){double s = 1;int i;double t = 1;double a = 1;for(i=1;i<=n;i++){a*=x;s+=a/t;t*=i+1;}return s;}int main(){int n;double x;while(scanf("%lf%d",&x, &n)==2) {printf("%lf\n",sum(x,n));}}3、#include "stdio.h"main( ){ register i,sum=0;for(i=1;i<=100;i++)sum=sum+i;printf("sum=%d\n",sum); }4、int fun(int x){ if(x<8) return x;return x%8+10*fun(x/8);}5、#include "stdio.h"int squre(int j);double power(double x,int n);main(){ int j=4;putchar('\n');printf("4的平方值为:%d \n ",squre(j));}int squre(int j){ return j*j; }double power(double x,int n){ double p;if (n>0)for (p=1.0;n>0;n--)p=x*x;elsep=1.0;return(p); }第6章答案1C 2AC 3D 5D 6C 7B 8BD 9D 10C 11D 12B 13C 14D 15C 16A17A 18B 19A 20CD 21A 22B 23D 24B 25C 26B 27B 28D 29D 30 A 31B1、0 数据类型2、8 83、整形表达式4、按行存储或者按列存储5、0 86、不做7、268、strcpy(s2,s1);9 6,10 10 \0 111 tt 1213 16 14 2 415 cde 16 1217 3 18 15三1、#include "stdio.h"#include "string.h"main(){ char s1[100],s2[100];int i,n=0,m;printf("请输入一个字符串:");gets(s1);m=strlen(s1);for(i=0;i<m;i++){if(islower(s1[i])){s2[n]=toupper(s1[i]);n++;}else if(isupper(s1[i])){ s2[n]=tolower(s1[i]);n++;}elsecontinue;}printf("从键盘上输入字符串为:%s\n",s1);printf("字母大小写转换后且滤掉非字母字符的字符串为:%s",s2); getchar();}2、#include "stdio.h"int *fun3(int *x,int *y);main(){ int a=10,b=20,*p;printf("未交换前a=%d,b=%d\n",a,b);fun1(a,b);printf("调用函数fun1后a=%d,b=%d\n",a,b);fun2(&a,&b);printf("调用函数fun2后a=%d,b=%d\n",a,b);p=fun3(&a,&b);printf("调用函数fun3后得到的最大值为:%d",*p); getch(); }fun1(int x,int y){ int t;t=x;x=y;y=t; }fun2(int *x,int *y){ int t;t=*x;*x=*y;*y=t; }int *fun3(int *x,int *y){if(*x>*y) return x;elsereturn y; }3、#include "stdio.h"main(){ int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};int i,j,*p[3],(*q)[4];printf("通过数组名来输出数组元素a[1][2]的值\n");printf("直接引用数组元素得a[1][2]的值为:%d\n",a[1][2]);printf("通过第2行的首地址得a[1][2]的值为:%d\n",*(a[1]+2));printf("通过数组名得到a[1][2]的值为:%d\n",*(*(a+1)+2));printf("通过a[0]得到a[1][2]的值为:%d\n",*(a[0]+4*1+2));printf("通过a[0][0]得到a[1][2]的值为:%d\n",*(&a[0][0]+4*1+2));printf("\n通过建立一个指针数组来输出数组元素a[1][2]的值\n"); for(i=0;i<3;i++)p[i]=a[i];printf("通过指针变量直接输出a[1][2]的值为:%d\n",p[1][2]);printf("通过指针数组元素来输出a[1][2]的值为:%d\n",*(p[1]+2));printf("通过指针数组的移动来输出a[1][2]的值为:%d\n",*(*(p+1)+2));printf("通过移动指针数组且带下标的方式输出a[1][2]的值为:%d\n",(*(p+1))[2]);printf("\n通过建立一个行指针来输出a[1][2]的值\n");q=a;printf("通过行指针直接输出a[1][2]的值为:%d\n",q[1][2]);printf("通过行指针元素来输出a[1][2]的值为:%d\n",*(q[1]+2));printf("通过行指针的移动来输出a[1][2]的值为:%d\n",*(*(q+1)+2));printf("通过移动行指针且带下标的方式输出a[1][2]的值为:%d\n",(*(q+1))[2]);}4、#include<AT89X51.H>void main(void){Const unsigned char desin[64]={0xFF,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,0xFF,0xFF,0xFE,0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0x0,0xE7,0xDB,0xBD,0x7E,0xFF,0xFF,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,0xFF,0xFF,0xFE,0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0x0,0xE7,0xDB,0xBD,0x7E,0xFF };unsigned int a;unsigned char b;do {for (b=0;b<64;b++){for (a=0;a<30000;a++);P1=desin[b];}}while(1);}。
1第5章嵌入式软件设计5.1 GNU 软件开发环境5.3 引导加载程序BootLoader 5.4 Linux 内核移植5.5 文件系统<25.1 GNU 软件开发环境GNU 开发环境的组成主要介绍:¾编译工具:gcc 、arm-Linux-gcc (交叉编译)¾make 和makefile ¾gdb<3源程序词法分析语法分析语义分析生成中间代码优化代码错误处理生成目标代码符号表及其管理目标程序编译工具的基本结构<45.1.1 GCC 简介GCC(GNU Compiler Collection) 是在UNIX 以及类UNIX 平台上广泛使用的编译器集合,它能够支持多种语言前端,包括C, Objective-C, Ada, Fortran, Java 和treelang 等。
GCC 设计中有两个重要的目标,其中一个是在构建支持不同硬件平台的编译器时,它的代码能够最大程度的被复用,所以GCC 必须要做到一定程度的硬件无关性;另一个是要生成高质量的可执行代码,这就需要对代码进行集中的优化。
为了实现这两个目标,GCC 内部使用了一种硬件平台无关的语言,它能对实际的体系结构做一种抽象,这个中间语言就是RTL(Register Transfer Language)。
<5源码解析语法树的优化RTL 代码生成函数调用优化转移指令优化寄存器扫描SAA (Static Single Assignment )优化公用子表达式削减二次公用子表达式优化数据流分析指令合并局部寄存器分配动循环语句优化指令时序调整二次指令时序调整寄存器类优先级选择寄存器移动基本块重新安排重载二次转移指令优化可延迟性分支时序安排多分支指令合并寄存器使用优化调试信息输出输出与程序对应的汇编语言程序用GCC 编译程序流程<6-ansi 只支持ANSI 标准的 C 语法。
这一选项将禁止GNU C 的某些特色,例如asm 或typeof 关键词-c 只编译并生成目标文件-E 只运行C 预编译器-g 生成调试信息。
嵌入式C语言的深入了解本文并不一本详细C语言教材,只是重点分析与嵌入式相关的各种C语言要求,这些要求构成了一般C程序与嵌入式C程序开发者之间重大区别.本课程是作为嵌入式开发的前导课程来准备C语言类型修饰符.C语言支持可以见到6种类型修饰符,分别是: auto, const, register, static, volatile, extern.●局部变量除非显式指明为static, 否则默认为auto,所以一般不会在代码中使用类型修饰符auto.●extern用于声明全局变量或全局函数,使用者要注意extern 的后的语句并不能产生实际定义.●Register是通知编译器,尽可能让所修饰的变量以寄存器的形式使用.在较新的编译器,优化器可以合理的分配寄存器,所以一般不会在代码中使用类型修饰符register.但是在单片机或嵌入式开发,有时强制使用register还是有实际含意.●而const,static,volatile有一些特定的需求Staticstatic 用于声明局域变量或局域函数,一个具有模式化编程的程序员应该多使用static,将私有数据和私有函数用static保护起来,不被外界访问.这一关键字起的作用类似于C++的private .1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。
它是一个本地的全局变量。
3) 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。
那就是,这个函数被限制在声明它的模块的本地范围内使用。
在一个大型项目里,static 被广泛使用,如果一个嵌入式C程度员很少使用static ,说明他至少对于数据保护的好处认识不够.ConstConst也是应该广泛的关键字,表示后面定义有可能是一个不变的常量,但是跟各种数据类型定义组合,能演变出复杂含义.Const 主要有如下应用情况1.声明后面是一个常量2.如果跟指针组合,将形成复杂的组合情况3.作函数参数数的修饰符.表示不能修改这一参数的值.主要是指针4.作函数返回值, 表示调用函数不能修改这一参数数的值.主要是指针Const 让人感到复杂是的,他的位置可以与被修饰的数据类型互换!其它的修饰符没有这样用法.这样换一般情况下是等效的,如const int c1= 5; 等效于int const c1=5;但是,我说是但是,如果数据类型是一个指针,互换一样位置表示完全不同含义,所以const 这一个用法经常是面试官用来折磨嵌入式C面试者的法宝之一.参看如下定义int b = 500;const int* a = &b; [1]int const *a = &b; [2]int* const a = &b; [3]const int* const a = &b; [4]这种定义要看 const 的位置来确定他的用法.const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。