嵌入式系统C语言编程基础

Q1:所有嵌入式系统的主流程最后都进入一个死循环,怎样用C语言实现─个死循环?

A1

while(1)
{
......
}

//例如:进入死循环,一直打印测试值1
#include<stdio.h> 
int main()
{
	int a = 1;
	while(1)
	{
		printf("测试值%d\n",a);
	}
}

在这里插入图片描述

Q2:while(){…}和do{…}while()有什么区别?

A2

while(){…}为入口条件循环,即在每次执行循环之前先检查判断条件; do{…}while()为退出条件循环,即在执行循环之后再检查判断条件。
即:
while循环结构的表达式为:while(表达式){循环体}
do-while循环结构表达式为:do{循环体;}while (条件表达)

也就是说,while循环执行时只有当满足条件时才会进入循环,进入循环后,执行完循环体内全部语句至当条件不满足时,再跳出循环。
do-while循环将先运行一次,在经过第一次do循环后,执行完一次后检查条件表达式的值是否成立,其值为不成立时而会退出循环。

如下:
在这里插入图片描述
while循环判断若为错,就不会进入循环,也就不会打印~
在这里插入图片描述
break语句用于跳出循环,continue语句用于结束本次循环。

Q3:用变量a给出下列定义

A3

a)一个整型数

int a = 1;

b)一个指向整型数的指针

int *a;

c)一个有10个整型数的的数组

int a[10];

d)一个有10个指针的数组,该指针是指向—个整型数的

int *a[10];

Q4:关键字static的作用是什么?

A4

在C语言中,关键字static有三个明显的作用:
1)在函数体内,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
2)在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。
3)在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。

在这里插入图片描述

Q5:关键字const的作用是什么?

A5

const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。
const常量与#define常量:

  • const有数据类型,是个常变量,define只是字符替换(而且可能产生意料不到的错误),define定义的宏在编译后就不存在了,它不占用内存,因为它不是变量,系统只会给变量分配内存。
  • define定义的宏是在预处理阶段展开的,而const定义的只读变量是在编译运行阶段使用的。

对于指针而言,可以指定指针本身为const,也可以指定指针所指的数据为const,const int b = &a;或者int const b = &a;修饰的都是后面的值,分别代表*b和b不能改变 。

//常变量的定义,下面两者是等价的
const  int  a = 1;
int  const  a = 1;

局部变量存储在栈中,静态变量存储在静态存储区中,而经过 const 修饰过的变量存储在内存中的“只读数据段”中。只读数据段中存放着常量和只读变量等不可修改的量。

Q6:定义一个标准宏MIN,这个宏输入两个参数并返回较小的一个。

A6

#define MIN(A,B)((A)<=(B)? (A)(B))

#define宏的副作用,下面的代码执行后会发生什么事:least = MIN(*p++,b);

//这样虽然输出的least的值是正确的,但是p的地址会发生改变,会指向下一个地址 

Q7:嵌入式系统中经常要对变量或寄存器进行位操作。给定一个int型变量a,写两段代码,第一个将a的bit 3置为1,第二个将a的bit 3置为0。以上两个操作中,要保持其它位不变。

A7

在这里插入图片描述

const int BIT3 = 0x01<<3;
static int a;
void SetBit3(void)
{
a |= BIT3;
}
void ClearBit3(void)
{
a &= ~BIT3;
}

Q8:嵌入式系统具有经常去直接访问物理地址的特点。在某工程中,要求设置一绝对地址为Ox5a00的整型变量的值为Oxaa55。写代码去完成这一任务。

A8

int *ptTemp = (int *)Ox5a00;
*ptTemp = Oxaa55;

Q9:下面这段代码的输出是什么?

A9

void foo(void) 
{ 
dnsigned int a = 6;
int b = -20; (a+b > 6) ? puts(">6"): puts("<6"); 
}

输出为“>6”,原因是当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。因此-20变成了一个非常大的正整数,所以该表达式计算出的结果大于6。这一点对于频繁用到无符号数据类型的嵌入式系统来说是丰常重要的。

Q10:请评论下面一段程序代码

void test()
{
char string[10];
char *str ="0123456789";
strcpy(string,str); 
}

A10

字符串str需要11个字节才能存放下(包括末尾的’\0’ (默认有的)),而string只有10个字节的空间,所以strcpy会导致数组越界。
在这里插入图片描述

Q11:请评论下面一段程序代码

void GetMemory(char *p)
{
p = (char *)malloc(0x20);
}
void Test(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str," Hello World!);
printf(str);
}

A11

编译器总是要为函数的每个参数制作临时副本,指针参数p的副本是P编译器使_p = p本例中,_p申请了新的内存,但只是_p的值改变了,p的值却丝毫未变,仍然为NULL。事实上,每执行一次GetMemory就会泄漏—块内存。

在这里插入图片描述

Q12:中断是嵌入式系统的重要组成部分。请评论下面一段中断服务子程序代码

_interrupt double compute_area (double radius)
{
double area = Pl * radius * radius;
printf("\nArea = %f" , area);
return area;
}

A12

  1. ISR不能返回值;2)不能向ISR传递参数;
    3)ISR应该是短而有效率的,因而在ISR中做浮点运算、使用printf等是不明智的,会经常有重入和性能上的问题。

在这里插入图片描述

  • 21
    点赞
  • 108
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 14
    评论
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是彦歆呀嘻嘻哈哈

你的鼓励将是我的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值