嵌入式C语言是嵌入式系统开发中最流行和最常用的编程语言之一。因此,在本文中,我们将了解一些嵌入式C程序的基础知识和嵌入式C的编程结构。
嵌入式C语言可能是嵌入式程序员中最流行的嵌入式系统编程语言。有许多流行的编程语言,如Assembly, BASIC, c++, Python等,经常用于开发嵌入式系统,但嵌入式C仍然流行,因为它的效率,更少的开发时间和可移植性。
在深入了解嵌入式C程序的基础知识之前,我们先来看看什么是嵌入式系统以及编程语言在嵌入式系统中的重要性。
什么是嵌入式系统?
一个嵌入式系统可以被最好地描述为一个同时具有硬件和软件并被设计来完成特定任务的系统。嵌入式系统的一个很好的例子,很多家庭都有,洗衣机。
我们几乎每天都在使用洗衣机,但不会想到它是一个由处理器(以及其他硬件)和软件组成的嵌入式系统。
它从用户那里获得一些输入,如洗涤周期、衣服类型、额外的浸泡和漂洗、旋转转速等,根据说明执行必要的操作,并完成洗涤和烘干衣服。如果没有给出下一次洗涤的新指令,那么洗衣机就会重复前一次洗涤的同一组任务。
嵌入式系统不仅可以是像洗衣机那样的独立设备,还可以是更大系统的一部分。一个例子是Car。一辆现代汽车有几个独立的嵌入式系统,它们执行各自的特定任务,目的是使旅程平稳和安全。
车内的嵌入式系统包括防抱死制动系统(ABS)、温度监测系统、自动气候控制系统、轮胎压力监测系统、发动机油位监测系统等。
也读嵌入式系统及其实时应用.
嵌入式系统编程
如前所述,嵌入式系统由硬件和软件两部分组成。如果我们考虑一个简单的嵌入式系统,主要硬件模块是处理器。处理器是嵌入式系统的核心,它可以是微处理器、微控制器、DSP、CPLD(复杂可编程逻辑器件)或FPGA(现场可编程门控阵列)。
所有这些设备都有一个共同点:它们是可编程的,也就是说,我们可以编写一个程序(这是嵌入式系统的软件部分)来定义设备如何实际工作。
嵌入式软件或程序允许硬件监视外部事件(输入/传感器)并相应地控制外部设备(输出)。在这个过程中,嵌入式系统的程序可能必须直接操作嵌入式硬件(通常是处理器)的内部架构,如定时器、串行通信接口、中断处理和I/O端口等。
从上面的陈述可以清楚地看出,嵌入式系统的软件部分与硬件部分同等重要。用写得很差的程序(软件)来拥有先进的硬件组件是没有意义的。
有许多用于嵌入式系统的编程语言,如汇编(低级编程语言)、C、c++、JAVA(高级编程语言)、Visual Basic、JAVA Script(应用程序级编程语言)等。
在制作一个更好的嵌入式系统的过程中,系统的编程起着至关重要的作用,因此,编程语言的选择是非常重要的。
选择编程语言的因素
以下是在为嵌入式系统的开发选择编程语言时要考虑的几个因素。
- 大小:程序所占用的内存是非常重要的,因为像微控制器这样的嵌入式处理器只有非常有限的ROM(程序内存)。
- 速度程序必须非常快,也就是说,它们必须尽可能快地运行。硬件不应该因为软件运行缓慢而变慢。
- 可移植性:相同的程序可以在不同的处理器上编译。
- 易于实现
- 易于维护
- 可读性
早期的嵌入式系统主要使用汇编语言开发。尽管汇编语言最接近实际的机器代码指令,并产生小尺寸的十六进制文件,但缺乏可移植性和大量的资源(时间和人力)花在开发代码上,使汇编语言难以使用。
还有其他高级编程语言也提供上述特性,但没有一种能接近C编程语言。使用嵌入式C作为主要编程语言的一些好处:
- 用C编写代码非常容易
- 与程序集相比,消耗的时间更少
- 代码的维护(修改和更新)非常简单
- 利用库函数降低主代码的复杂性
- 只需进行很少的修改,就可以轻松地将代码移植到其他体系结构中
嵌入式C编程语言导论
在深入了解嵌入式C程序设计语言的细节和嵌入式C程序的基础知识之前,我们将首先讨论一下C程序设计语言。
由Dennis Ritchie在60年代末70年代初开发的C程序设计语言是目前最流行、使用最广泛的程序设计语言。C编程语言使用简单的编译器(一种将程序转换为机器代码的软件)提供低级内存访问,并实现了到机器指令的高效映射。
C编程语言变得如此流行,它被广泛应用于从嵌入式系统到超级计算机的各种应用程序中。
嵌入式C程序设计语言是C程序设计语言的延伸,在嵌入式系统的开发中得到了广泛的应用。嵌入式C编程语言使用与C编程语言相同的语法和语义,如主函数、数据类型声明、定义变量、循环、函数、语句等。
在嵌入式C语言中,对标准C语言的扩展包括I/O硬件寻址、定点算术运算、访问地址空间等。
C语言与嵌入式C语言的区别
实际上,除了少数扩展和操作环境之外,C和Embedded C之间没有太大的区别。C语言和Embedded C语言都是ISO标准,它们的语法、数据类型、函数等几乎相同。
嵌入式C语言基本上是对标准C编程语言的扩展,具有额外的特性,如寻址I/O、多内存寻址和定点算法等。
C语言通常用于开发桌面应用程序,而嵌入式C语言则用于开发基于微控制器的应用程序。
嵌入式C程序基础
现在我们已经了解了一些关于嵌入式系统和编程语言的知识,我们将深入了解嵌入式C程序的基础知识。我们将从嵌入式C程序的两个基本特性开始:关键字和数据类型。
关键词:嵌入式C
关键字是一个对编译器有特殊含义的特殊词(例如C编译器,是一种用于将C语言编写的程序转换为机器码的软件)。例如,如果我们使用Keil的Cx51编译器(基于8051的微控制器的流行C编译器),以下是一些关键字:
- 位
- sbit
- sfr
- 小
- 大
下表列出了与Cx51 C Compiler相关的所有关键字。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
嵌入式C中的数据类型
C编程语言(或任何相关的编程语言)中的数据类型帮助我们在程序中声明变量。C编程语言中有许多数据类型,如有符号整型、无符号整型、有符号char型、无符号char型、浮点数、双精度等。除了这些,在嵌入式C中还有一些其他的数据类型。
以下是嵌入式C中与Keil的Cx51编译器相关的额外数据类型。
- 位
- sbit
- sfr
- sfr16
下表显示了Cx51 Compiler中的一些数据类型及其范围。
数据类型 | 位(字节) | 范围 |
位 | 1 | 0或1 (RAM的位可寻址部分) |
符号整数 | 16 (2) | -32768 + 32767 |
无符号整型 | 16 (2) | 0到65535 |
签署了字符 | 8 (1) | -128 + 127 |
无符号 | 8 (1) | 0到255 |
浮动 | 32 (4) | ±1.175494±3.402823 e+38 38吗 |
双 | 32 (4) | ±1.175494±3.402823 e+38 38吗 |
sbit | 1 | 0或1 (RAM的位可寻址部分) |
sfr | 8 (1) | RAM地址(80h到FFh) |
sfr16 | 16 (2) | 0到65535 |
嵌入式C程序的基本结构(嵌入式C程序模板)
在《嵌入式C程序基础》中要理解的下一件事是嵌入式C程序的基本结构或模板。这将帮助我们理解如何编写嵌入式C程序。
下面的部分展示了嵌入式C程序的基本结构。
-
- 多行注释. . . . .表示使用 /*......*/
- 单行注释. . . . .表示使用/ /
- 预处理器指令. . . . .# include <…>或#定义
- 全局变量. . . . .在程序的任何地方都可以访问
- 函数声明. . . . .声明函数
- 主要功能. . . . .Main Function,执行从这里开始
{
局部变量. . . . .变量仅限于主函数
函数调用. . . . .调用其他函数
无限循环. . . . .比如while(1)或者for(;;)
声明. . . . .
....
....
} - 函数定义. . . . .定义的函数
{
局部变量. . . . .仅限于此函数的局部变量
声明. . . . .
....
....
}
在看到关于的例子之前8051单片机,我们将首先看到上述结构中的不同组成部分。
嵌入式C程序的不同组件
评论:注释是为帮助我们(读者)轻松理解代码而编写的可读文本。它们被编译器忽略,并且在最终代码中(编译后)不占用任何内存。
有两种方法可以编写注释:一种是用//表示的单行注释,另一种是用/*....*/表示的多行注释。
预处理器指令:嵌入式C中的预处理器指令是对编译器的一个指示,它必须在这个文件中查找程序中没有定义的符号。
在C语言(也包括嵌入式C语言)中,预处理器指令通常使用#符号表示,比如#include…或#define....
在嵌入式C编程中,我们通常使用预处理器指令来指示特定于微控制器的头文件,该头文件包含所有SFRs和这些SFRs中的位。
以8051为例,Keil Compiler有一个" reg51.h "文件,必须在每个嵌入式C程序的开始写入。
全局变量:全局变量,顾名思义,是程序的全局变量,也就是说,它们可以在程序的任何地方被访问。
局部变量:与全局变量相比,局部变量受限于各自的函数。
主要功能:每个C或嵌入式C程序都有一个主函数,从程序开始执行的地方开始。
相关帖子:“嵌入式系统项目思想”。
基本嵌入式C程序
到目前为止,我们已经了解了一些嵌入式C程序的基础知识,比如C和嵌入式C的区别,嵌入式C程序的基本结构或模板,以及嵌入式C程序的不同组件。
继续深入,我们将在一个例子的帮助下探索嵌入式C程序的基础知识。在本例中,我们将使用8051单片机使连接到微控制器PORT1的led闪烁。
嵌入式C程序示例
下图显示了示例电路的电路图。它包含一个基于8051的微控制器(AT89S52)基本组件(如复位电路,振荡器电路等)和闪烁led组件(led和电阻)。
为了编写上述电路的嵌入式C程序,我们将使用Keil C编译器。这个编译器是KeilµVision IDE的一部分。程序如下所示。
# include < reg51.h >/ /预处理器指令
空白延迟(int);//延迟函数声明
void main(空白)/ /主函数
{
P1 = 0 x00;
/*使PORT1引脚低。所有的led灯都熄灭了。
* (P1是PORT1,如reg51.h中定义的那样)*/
而(1)/ /无限循环
{
P1 = 0 xff;//使PORT1引脚高,即led灯亮。
延迟(1000);
/*函数参数为1000的呼叫延迟功能。
这将导致1000mS的延迟,即1秒*/
P1 = 0 x00;//使PORT1引脚低,即led熄灭。
延迟(1000);
}
}
无效延迟(int d)//延迟函数定义
{
unsigned int i = 0;/ /局部变量。只能在此函数中访问。
/*以下步骤将导致1000mS的延迟
*(或根据调用delay函数时输入的值)*/
(;d > 0;d -)
{
(i = 250;我> 0;我——);
(i = 248;我> 0;我——);
}
}
13的反应
248和250在计算延时方面有什么意义呢?
它们都相加并生成一个计数为498的for循环,这将产生1ms的延迟。因此,如果这个for循环重复1000次,就会产生1000ms的延迟
在我看来,它没有加起来,它乘以250*248,1行函数在cpp中不需要{}符号,至少在C中不需要
实际上for循环需要2个机器循环,这意味着执行2微秒,这意味着250*2+248*2=996 us+ 4us的函数调用总1000us=1ms微控制器忙,这是延迟1ms
我对嵌入式软件没有完全的了解,所以请帮助我学习一个嵌入式软件
在嵌入式系统中,你需要开始做的事情很少,你可以开始做的事情很少
软件(IDE) - Keil 4或Keil 5,
微控制器(8051或avr或pic或arm)的数据表,
一点关于硬件的知识。
C语言基础知识。
不过,如果需要任何帮助,尽管开口
你能帮我写一个学校时刻表的嵌入式代码吗
他们不乘。看到循环后面的分号了吗?控件一直停留在那里,直到循环条件失败
为什么不直接用“for(i=498;i>0;i - -);”?
这对嵌入式学习非常有用,并分享越来越多对我们有帮助的嵌入式c代码。
大家好,我只有一个问题有人知道我在哪里可以上这方面的在线课程吗?这可能包括一些实践与UC PIC?
你知道如何将传感器值存储到数组中吗?
你好先生
下面的程序是自动强度控制路灯使用8051单片机
但这里shift = shift + 1;
shift = shift - 1;
表明
还有if(shift == 200)从我们取的值200开始
请帮我找出答案
void main ()
{
转变= 0;
maxpwm_flag = 0;
而(1)
{
如果(maxpwm_flag = = 1)
{
Shift = Shift - 1;
}
其他的
{
Shift = Shift + 1;
}
如果(转变= = 200)
{
转变= 200;
maxpwm_flag = 1;
城市= 0;
T0_Delay (20000);
}
如果(转变= = 0)
{
转变= 0;
maxpwm_flag = 0;
城市= 1;
T0_Delay (20000);
}
PWM_DELAY(转变);