雷竞技注册
技术文章

用于嵌入式应用程序的C编程语言简介

2019年1月03日经过罗伯特·凯

本文讨论了C的基本特征,这是一种仍然广泛用于编程微控制器的直接语言。

本文讨论了C的基本特征,这是一种仍然广泛用于编程微控制器的直接语言。

支持信息

通过现代技术的标准,C是一种相当古老的语言。原始发展在70年代初发生,随后在70年代后期的修订和80年代的标准化。尽管如此,在我看来,它已经失去了它的活力。它仍然是嵌入式应用程序的一种很好的语言,并且在我的经验中,它是一个合适的编程环境,从简单的微控制器的设备到复杂的数字信号处理。

需要c

I have no doubt that there are at least a few electrical engineers who do not know how to write a program in C and never will need to write a program in C. If you’re the sort of person who prefers hardware to software, you might consider these individuals “the lucky ones.”

但是,我们是否喜欢或不喜欢,编程是电气工程的越来越重要的一部分,其实我在能够不仅设计电路板而且为这些板上写下固件时,我已经找到了很大的满足感。系统发展的这两个方面密切相关,我怀疑最终结果通常在同一个人进行板设计和固件开发时往往优越。

C与汇编

理论上,我是一个汇编语言的支持者。实际上,我已经达到了我生命中的一点,汇编语言对我的财务安全和理智来说是一种威胁。在装配中编写固件缓慢而容易出错,并长期保持足够的组织水平,复杂的程序是绝望的。

但是,我肯定是坚持认为你无法真正理解高级语言如果你不明白的装配。If you’ve never had the opportunity to gain some solid experience with assembly language, you should at least familiarize yourself with some of the basic concepts before you dive into C. The articles listed above in the Supporting Information section are a good place to start.

如果您想了解有关此主题的更多信息,请查看我们的完整文章组装与C.

处理器理解什么?

只有机器语言。那些和零。C语言的所有“程序员友好”的各个方面最终必须转换为处理器的数字硬件-i.e的低级现实,即二进制算术,逻辑运算,数据传输,寄存器和内存位置。

它当然可以在C中成功编写一个程序,同时知道实际硬件,但在嵌入式系统开发的上下文中,它有用,有时需要了解您的硬件以及C代码如何与该硬件交互方式。

基础知识

C程序范围从那些非常复杂的人那些非常简单。在嵌入式世界中,许多程序将倾向于频谱的简单方面,下面描述的基本编程元件为进一步研究C语文固件开发提供了良好的基础。

包括陈述

嵌入式C程序将从至少一个#include语句开始。这些语句用于将单独文件的内容引入源文件中。这是一种易于组织代码的方便方式,它还允许您使用制造商提供的库功能,硬件配置例程和注册定义。

下面的代码摘录显示了我在其中一个微控制器项目中使用的include语句。请注意,“project_defsvarsfuncs.h”文件是程序员(即,ME)创建的自定义头文件。我用它作为将预处理器定义,变量和函数原型合并到多个源文件中的便捷方式。

// ----------------------------------------------------------------------------------- // Includes //----------------------------------------------------------------------------- #include // SFR declarations #include "Project_DefsVarsFuncs.h" #include "InitDevice.h" #include "cslib_config.h" #include "cslib.h"

预处理器定义

您可以使用#define语句来创建一个字符串,该字符串将被数字替换。预处理器定义不是必需的,但在某些情况下,它们非常有用,因为它们允许您轻松修改程序中各种不同部分中的值。

例如,假设您使用微控制器的ADC,并且您的代码在几个单独的计算中使用ADC的采样率。预处理器定义允许您在计算代码中使用直观的字符串(如sample_rate)而不是数字本身,如果您正在尝试不同的样本速率,则只需在预处理器定义中更改一个数值。

#define sample_rate 100000

您可以将100000更改为任何其他号码,此新号码将用于替换字符串示例的所有实例。

预处理器定义也是使代码更可读的好方法。以下是我包含在我所有的固件项目中的友好#define语句的列表。

#define bit7 0x80 #define bit6 0x40 #define bit5 0x20 #define bit4 0x10 #define bit3 0x08 #define bit2 0x04 #define bit1 0x02 #define bit1 0x02 #define bit0 0x01 #define high 1 #define低0 #define true 1 #define false 0 #define设置1 #define清除0 #define Lowbyte(V)((未签名的Char)(V))#define HighByte(V)((未签名的Char)(((未签名的int)(v))>> 8))

重要的是要了解预处理器定义与硬件没有直接关系。您只是告诉预处理器在编译程序之前用另一个字符串替换一个字符串。

变量

处理器将数据存储在寄存器和内存位置。就硬件而言,真的没有像变量那样的事情。但是,对于程序员,当我们可以使用直观命名的变量而不是内存地址或寄存器号码时,编写代码更容易。

Compilers can manage the low-level details associated with variables without much input from the programmer, but if you want to optimize your use of variables you'll need to know something about the device’s memory configuration and the way in which it handles data of different bit widths.

以下代码摘录给出了变量定义的示例。这是为Keil CX51编译器编写的,该编译器保留一个字节的内存,用于“无符号Char”定义,“无符号int”定义的两个字节,以及“无符号长”定义的四个字节。

无符号长累积_capacitance_sensor1;无符号长累积_capacitance_sensor2;unsigned int sensor1_unucressed;unsigned int sensor2_unucressed;unsigned int sensor1_measurement;unsigned int sensor2_measurement;无符号int angularposition;unsigned int touchduration;未签名的char currenddigit;无符号int特征; unsigned char DisplayDivider;

运营商,条件陈述和循环

计算功能的核心包括移动数据,使用数据执行数学计算和逻辑操作,并基于存储或生成数据的值进行编程决策。

通过操作员完成数学操作和比特操纵。C有相当多的运算符:等于(=),添加(+),减法( - ),乘法(*),分割(/),位和(&),按位或(|),等等。对操作员语句的“输入”是变量或常量,结果存储在变量中。

条件语句允许您根据给定条件是否为真或错误来执行或不执行操作。这些陈述使用“if”和“else”单词;例如:

if(Sensor1 

对于循环,虽然循环提供了方便地反复执行代码块的方法。这些类型的任务通常在嵌入式应用程序中经常出现。对于循环更为导向到必须执行特定次数的代码块的情况,而当处理器应该继续重复相同的代码块时,循环是方便的,直到条件从true更改为false。这是两种类型的例子。

for(n = 0; n <16; n ++){累积_capacitance_sensor1 + = mefory_capacitance(sensor_1);delay_us(50);累积_capacitance_sensor2 + = mefory_capacitance(sensor_2);delay_us(50);}
而(compersion_done == false);{LED_STATE =!LED_STATE;delay_ms(100);}

功能

在组织和可读性方面,良好的C代码远远优于装配代码,这是大部分使用功能。

函数是代码块,可以轻松地结合到代码的其他部分中。导致处理器执行该函数中包含的指令被称为“调用”该功能。函数可以接受一个或多个输入,它可以提供一个输出,称为返回值。

C的函数,条件语句和循环使其相当容易将流程图转换为工作代码。此示例来自我使用的项目SPI通信控制液晶显示屏

函数的使用确实涉及一些开销,因此我们必须小心不受处理器的过度函数调用,但总的来说,功能远远超过了成本的功能。

以下是具有三个数值输入的函数的示例,并使用这些输入来生成真假返回值。

bit is_in_range(int输入,int下行,int上行){if(输入> = deputbound &&输入<=上行)返回true;否则返回false;}

结论

彻底讨论C语言几乎无限期地继续,这篇文章只划伤了表面。甚至犹豫甚至发布一些省略这么多重要信息的东西,但我们必须在某处开始。我们计划在嵌入式应用程序中发布有关使用C语言的更多条文,并将填写此介绍性文章,并将其作为其他资源可用。

如果您有任何相关的主题,您希望了解更多信息,请随时在下面的评论部分中告知我们。

C语言系列

9评论
  • S.
    Shivangi Jaiswal. 2019年1月4日

    是的,我想要更多有关嵌入式计算的信息,并加入任何与嵌入式系统相关的电子公司。我在这个领域的兴趣领域。这是我做与这个领域相关的工作的梦想。
    如果您还建议与此领域相关的公司或工作,这将是我的荣幸。

    像。 回复
  • R.
    rishabh singhadiya. 2019年1月4日

    Hindi翻译Ho Skta He Kya

    像。 回复
  • Z.
    宙斯卡纳山脉 2019年1月06日

    谢谢查尔斯你分享了一些非常有用的知识,

    电加热器

    像。 回复