程序设计语言+嵌入式系统设计师备考笔记

news2024/11/19 0:34:53

0、前言

  本专栏为个人备考软考嵌入式系统设计师的复习笔记,未经本人许可,请勿转载,如发现本笔记内容的错误还望各位不吝赐教(笔记内容可能有误怕产生错误引导)。

1、嵌入式系统开发与设计

1.1嵌入式应用程序的生成与加载

嵌入式软件开发的特点:

  • 需要交叉编译工具
  • 通过仿真手段进行测试
  • 开发板是中间目标机
  • 可利用的资源有限
  • 需要与硬件打交道

嵌入式软件开发的挑战:

  • 软硬件协同设计
  • 嵌入式操作系统
  • 代码优化
  • 有限的I/0功能

嵌入式系统开发最大特点:

  • 软硬件综合开发。
  • 嵌入式产品是软硬件的结合体
  • 软件针对硬件开发、固化,不能进行任意修改

嵌入式软件开发模式通常是包括三种:

  • 本机开发
  • 交叉开发:见下图,提供了丰富的开发工具,可以及时调试与修改程序。
  • 模拟开发:在宿主机上面模拟了一个目标机的环境

 宿主机与目标机:

下载与运行:

 

嵌入式软件开发流程: 

1.2解释程序/编译程序


●解释程序
也称解释器;直接解释执行源程序,或者将源程序翻译成某种中间代码后再加以执行。
●编译程序
也称编译器,将源程序翻译成目标语言程序,然后在计算机上运行日标程序。
●两者的根本区别
编译方式下,机器上运行的是与源程序等价的目标程序,源程序和编译程序都不再参与目标程序的执行过程。
解释方式下,解释程序和源程序(或某种等价表示)要参与到程序的运行过程中,运行程序的控制权在解释程序。
即:解释方式,翻译程序不生成独立的日标程序,而编译方式则生成独立保持的日标程序。 

1.3 编译器工作的过程


 ●词法分析阶段
是编译过程的第一阶段,其任务是对源程序从前到后(从左到右)逐个字符扫描,从中识别出一个个“单词”符号。
词法分析过程的依据是语言的词法规则,即描述“单词”结构的规则。
●语法分析阶段
其任务是在词法分析的基础上,根据语言的语法规则将单词符号序列分解成各类语法单位。通常语法分析是确定整个输入串是否构成一个语法上正确的程序。一般来说,通过编译的程序,不存在语法上的错误。
●语义分析阶段
其任务主要检查源程序是否包含静态语义错误,并收集类型信息供后面的代码生成阶段使用。语义分析的一个主要工作是进行类型分析和检查。
●中间代码生成
其任务是根据语义分析的输出生成中间代码。
●目标代码生成
是编译器工作的最后一个阶段。其任务是把中间代码变换成特定机器上的绝对指令代码、可重定位的指令代码或汇编指令代码。本阶段与具体机器密切相关。
●符号表管理
符号表的作用是记录源程序中各个符号的必要信息,以辅助语义的正确性检查和代码生成,在编译过程中需要对符号表进行快速有效地查找、插入、修改和删除等操作。

 2、程序设计语言

2.1程序设计语言

2.1.1常见编程语言分类

 Fortran语言(科学计算,执行效率高)

Pascal语言(为教学而开发的,表达能力强,Delphi)

C语言(指针操作能力强,高效)

Lisp语言(函数式程序语言,符号处理,人工智能)

C++语言(面向对象,高效)
Java语言(面向对象,半解析半执行中间代码,跨平台)

C#语言(面向对象,中间代码,.Net)

Prolog语言(逻辑推理,简洁性,表达能力,数据库和专家系统)

Python语言(一种脚本语言)HTML

2.1.2程序语言的成分

数据是程序操作的对象,具有以下的属性:

常量 变量 全局量 局部量

数据名称:由用户通过标识符命名
数据类型:说明数据占用内存的大小和存放形式

存储类别:说明数据在内存中的位置和生存期

作用域:说明可以使用数据的代码范围

生存期:说明数据占用内存的时间范围 

 程序设计语言的基本成分包括:数据、运算、控制和传输

数据类型:

  1.  基本类型:整形、字符型、实型、布尔型
  2. 特殊类型:空类型(void)
  3. 用户定义类型:枚举类型
  4. 构造类型:数组、结构、联合
  5. 指针类型:type*
  6. 抽象类型:类类型

数据类型转换规则:char,short到int到unsigned到long,float到double

 运算成分:

       指明允许使用的运算符号及运算规则,运算符号要规定优先级和结合性,大多数高级程序语言的基本运算包括了:

  • 算术运算
  • 关系运算
  • 逻辑运箅
  • 位运箅

控制成分: 

三种基本逻辑结构

  1. 顺序结构:是一种线性有序的结构,由一系列依次执行的语句或模块构成
  2. 循环结构:是由一个或几个模块构成,程序运行时重复执行,直到满足某一条件为止
  3. 选择结构:是根据条件成立与否选择执行路径的结构

传输成分:

传值/传址 :

  1. 传值调用(有去无回):实际上重新复制了一个副本给形参不改变调用函数实参变量的内容
  2. 传址调用(有去有回):将实参地址给形参将改变调用函数实参变量的内容

表达式: 

前缀表达式(+ab)

中缀表达式(a+b)

后缀表达式(ab-) 逆波兰式

高级程序设计语言:

 

解析程序基本原理:

解释程序是另一种语言处理程序,在词法、语法和语义分析方面与编译程序的工作原理基本相同。
但在运行用户程序时,它直接执行源程序或源程序的内部形式。因此,解释程序与编译程序最大的区别就是不产生源程序的目标程序
解释程序通常可分为两部分

  • 分析部分,包括通常的词法分析、语法分析和语义分析程序,经分析后把源程序翻译成
  • 中间代码。 
  • 解释部分,用来对第一部分所产生的中间代码进行解释执行。

实现的三种方式:

直接被解释执行

先将源程序翻译成某种中间代码形式,然后再对中间代码进行解释,根据中间代码级别的方式不同,分为B、C两种方式见下图:

2.2面向过程的语言

c语言的基本概念:

C预处理:

 预处理代码例程:

#include <stdio.h>
#define square(x) ((x)*(x))
#define square_1(x) (x *x)
int main(void)
{
printf("'square 5+4 is %d\n", square(5+4));%81
printf("square_1 5+4 is %d\n", square_1(5+4));%26
return 0;
}

预定义宏:

宏名的书写由标识符与两边各两条下划线构成

基本数据类型:

存储管理: 

函数调用过程: 

变量的存储与作用域:

/*全局变量,因定地址,其它源文件可见*/
int global_static;
/静态全局变量,因定地址,但只在本文件中可见"/
static int file_static;

/*函致参数,位于栈帧当中,动态创建,动态释放"/
int foo (int auto_program)
{

/*静态局部变量,因定地址,只在本函数中可见"/
static int func_static;

/普通局部变量,位于栈顿当中,只在本函数中可见"/
int auto_i, auto _a[10};

/动态申请的内存空间,位于堆当中"/
double *auto_d=malloc(sizeof(double)"5);
reuturn auto i;
}

 

2.3面向对象的语言

面向对象编程(Object-Oriented Programming,简称OOP)是一种程序设计范式,通过将数据项和操作封装在对象中来组织和管理代码。下面是面向对象编程的一般流程:

  1. 分析问题

    • 首先,需要对解决的问题进行分析和理解。明确问题的需求和功能,识别需要解决的实体和行为。
  2. 设计类

    • 根据问题的需求和实体的特征,设计表示问题域中实体的类。类包括属性(数据项)和方法(操作),用于描述实体的状态和行为。
  3. 定义类

    • 在编程语言中定义类,描述类的属性和方法。属性用于存储对象的状态,方法用于操作对象。
  4. 创建对象

    • 根据类的定义,创建类的实例(对象)。对象是类的具体实体,可以访问类的属性和方法。
  5. 封装

    • 封装是指将数据(属性)和行为(方法)封装在对象内部,隐藏对象的内部实现细节,提供接口供外部访问和操作。
  6. 继承

    • 如果存在类之间的共性和关系,可以使用继承机制构建类之间的层次结构。子类(派生类)可以继承父类(基类)的属性和方法,实现代码的重用和扩展。
  7. 多态

    • 多态是面向对象编程的重要特征,通过多态可以实现同一接口的不同实现。使用多态可以提高代码的灵活性和可维护性。
  8. 实现功能

    • 根据类和对象的定义,实现程序的功能,通过对象之间的交互实现问题的解决。
  9. 测试和调试

    • 编写好代码后,需要对程序进行测试和调试,确保程序的功能正确并且没有错误。
  10. 优化和扩展

    • 根据需求,可以对程序进行优化和扩展。可以添加新的类、方法或属性,提高程序性能和可扩展性。

以上是面向对象编程的一般流程,通过遵循这个流程,可以更好地设计、构建和维护面向对象的程序,提高代码的可读性、可维护性和可扩展性。

c++的基本概念:

        Peter Coad和Edward Yourdon提出用下面的等式来识别面向对象方法,采用这四个概念开发的软件系统是面向对象的。这个考的不多,图里面的掌握就差不多了。

 

在C++中,多态(polymorphism)、重载(overloading)和覆盖(overriding)是面向对象编程中常用的概念,用于实现不同类型的对象之间的灵活性和可复用性。以下是它们的概念及区别:

  1. 多态(Polymorphism)

    • 多态是指同一个函数名可以具有不同的行为表现形式的能力。在C++中,多态分为静态多态(编译时多态)和动态多态(运行时多态):
      • 静态多态:通过函数的重载(overloading)和运算符重载(operator overloading)来实现,编译器在编译时根据函数调用的参数类型或个数确定具体调用的函数。
      • 动态多态:通过虚函数和继承关系(inheritance)实现,使用基类的指针或引用指向派生类对象,在运行时确定调用的函数。
  2. 重载(Overloading)

    • 重载是指在同一作用域内允许使用相同名称但参数列表不同的函数。在C++中,函数重载可以根据函数参数的类型、个数或顺序来区分同名函数,从而实现多态。
    • 重载函数的返回类型不是区分函数的标准。函数重载可以让开发者通过命名相似的函数来增加代码的可读性和可维护性。
  3. 覆盖(Overriding)

    • 覆盖是指在派生类中重新定义基类中已有的虚函数,以实现不同的行为。通过继承和重写基类中的虚函数,派生类可以提供自己的实现逻辑。
    • 子类中的覆盖函数的函数签名(函数名、参数列表、常量性等)必须与基类中的虚函数一致,否则不会形成覆盖。

在C++中,继承是一种面向对象编程的重要概念,允许一个类(称为派生类)基于另一个类(称为基类)的定义来构建。通过继承,派生类可以继承基类的属性和方法,同时可以添加自己的属性和方法,从而实现代码的重用和扩展。下面以一个简单的示例说明继承的概念: 

#include <iostream>
using namespace std;

// 基类
class Animal {
public:
    void eat() {
        cout << "Animals eat food" << endl;
    }
};

// 派生类
class Dog : public Animal {
public:
    void bark() {
        cout << "Dogs bark" << endl;
    }
};

int main() {
    Dog myDog;
    myDog.eat();  // 派生类对象可以调用从基类继承的方法
    myDog.bark(); // 派生类对象也可以调用自己添加的方法

    return 0;
}

在上面的例子中,我们定义了一个基类Animal和一个派生类Dog。派生类Dog通过关键字public继承了基类Animal。派生类Dog可以访问基类Animal中的eat()方法,同时也可以添加自己的方法bark()。在main()函数中,我们创建了一个Dog类的对象myDog,并通过该对象调用了继承自基类的eat()方法和派生类自己的bark()方法。

继承的优势在于可以实现代码的重用和扩展,减少重复代码的编写,并且可以通过多层次的继承建立类之间的层次结构。继承也为多态和代码复用提供了基础,是面向对象编程中的重要概念之一。

尾言

        本专栏我总结了大量的思维导图,但是因为思维导图太大与CSDN的排版不匹配,故我会把每篇博文绘制的思维导图上传到我的资源里,有需要的自取,我会设置为0积分下载的,创作不易还望各位大佬点赞支持一下谢谢

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1540270.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在线获取文本列表并集计算器

具体请前往&#xff1a;在线文本并集计算工具

rabbitmq 3.9.29 docker mac 管理员页面无法打开

SyntaxError: Unexpected token ‘catch’ SyntaxError: Unexpected token ‘catch’ at EJS.Compiler.compile (http://127.0.0.1:15672/js/ejs-1.0.min.js:1:6659) at new EJS (http://127.0.0.1:15672/js/ejs-1.0.min.js:1:1625) at format (http://127.0.0.1:15672/js/main…

【Flask】Flask数据迁移操作

Flask数据迁移操作 前提条件 安装第三方包&#xff1a; # ORM pip install flask-sqlalchemy # 数据迁移 pip install flask-migrate # MySQL驱动 pip install pymysql # 安装失败&#xff0c;指定如下镜像源即可 # pip install flask-sqlalchemy https://pypi.tuna.tsinghu…

【Docker】golang操作容器使用rename动态更新容器的名字

【Docker】golang操作容器使用rename动态更新容器的名字 大家好 我是寸铁&#x1f44a; 总结了一篇golang操作容器使用rename动态更新容器的名字✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 前言 今天遇到一个新的需求&#xff0c;要动态改变运行中的容器名字。 可以考虑先把…

鸿蒙实战开发-如何通过拖动滑块调节应用内字体大小

介绍 本篇Codelab将介绍如何使用基础组件Slider&#xff0c;通过拖动滑块调节应用内字体大小。要求完成以下功能&#xff1a; 实现两个页面的UX&#xff1a;主页面和字体大小调节页面。拖动滑块改变字体大小系数&#xff0c;列表页和调节页面字体大小同步变化。往右拖动滑块字…

Redis 教程系列之Redis 安装(二)

Windows 下安装 下载地址:Releases tporadowski/redis GitHub。 Redis 支持 32 位和 64 位。这个需要根据你系统平台的实际情况选择,这里我们下载 Redis-x64-xxx.zip压缩包到 C 盘,解压后,将文件夹重新命名为 redis。 打开文件夹,内容如下: 打开一个 cmd 窗口 使用 c…

更改Ubuntu桌面环境

功能异常 1&#xff1a; Ubuntu 22.04 将桌面 .desktop文件&#xff0c;用鼠标拖动到左侧的收藏夹菜单栏&#xff1a;无法实现&#xff0c;且会造成原来的 .desktop文件异常失效。 在多桌面环境下&#xff0c;切换到 KDE桌面&#xff0c;桌面 .desktop文件则是正常 OK的。 都 …

使用 PyOpenGL 进行 2D 图形渲染总结

一、说明 OpenGL是一个广泛使用的开放式跨平台实时 3D 图形库&#xff0c;开发于二十多年前。它提供了一个低级API&#xff0c;允许开发人员以统一的方式访问图形硬件。在开发需要硬件加速且需要在不同平台上运行的复杂 2D 或 3D 应用程序时&#xff0c;它是首选平台。它可以在…

CSS3 中的盒模型:标准与IE盒模型的差异

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

pytest之统一接口请求封装

pytest之统一接口请求封装 pytest的requests_util.pyrequests_util.py 接口自动化测试框架的封装yaml文件如何实现接口关联封装yaml文件如何实现动态参数的处理yaml文件如何实现文件上传有参数化时候&#xff0c;怎么实现断言yaml的数据量大怎么处理接口自动化框架的扩展&#…

谷歌seo营销服务有哪些服务?

以我们举例&#xff0c;如果你在做B2B外贸建站&#xff0c;这里有全套保姆式托管服务&#xff0c;让你既省心又省力&#xff0c;七天就能搞定网站建设&#xff0c;快速上线&#xff0c;再来就是谷歌白帽SEO&#xff0c;我们这边强调的是纯白帽操作&#xff0c;专注于高质量的原…

linux源配置:ubuntu、centos;lspci与lsmod命令区别

1、ubuntu源配置 1&#xff09;先查电脑版本型号: lsb_release -c2&#xff09;再编辑源更新&#xff0c;源要与上面型号对应 参考&#xff1a;https://midoq.github.io/2022/05/30/Ubuntu20-04%E6%9B%B4%E6%8D%A2%E5%9B%BD%E5%86%85%E9%95%9C%E5%83%8F%E6%BA%90/ /etc/apt/…

基于springboot+vue的旅游网站

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

CICD流水线(ali)

后端CICD 一、打开云效流水线&#xff0c;创建流水线

全球大型语言模型(LLMS)现状与比较

我用上个博文的工具将一篇ppt转换成了图片&#xff0c;现分享给各位看官。 第一部分&#xff1a;国外大语言模型介绍 1&#xff0c;openai的Chatgpt 免费使用方法1&#xff1a;choose-carhttps://share.freegpts.org/list 免费使用方法2&#xff1a;Shared Chathttps://share…

Collection与数据结构 数据结构预备知识(二):包装类与泛型

1.包装类 在Java中,由于基本类型不是继承自Object,为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了一个包装类.可以把包装类理解为基本数据类型所对应的引用数据类型. 1.1基本数据类型与对应的包装类 基本数据类型包装类byteByteshortShortintIntegerlongLong…

AJAX-综合

文章目录 同步代码和异步代码回调函数地狱解决回调函数地狱Promise-链式调用async函数和awaitasync函数和await-捕获错误 事件循环宏任务与微任务Promise.all静态方法 同步代码和异步代码 同步代码&#xff1a;逐步执行&#xff0c;需原地等待结果后&#xff0c;才继续向下执行…

LLM漫谈(五)| 从q star视角解密OpenAI 2027年实现AGI计划

最近&#xff0c;网上疯传OpenAI2027年关于AGI的计划。在本文&#xff0c;我们将针对部分细节以第一人称进行分享。​ 摘要&#xff1a;OpenAI于2022年8月开始训练一个125万亿参数的多模态模型。第一个阶段是Arrakis&#xff0c;也叫Q*&#xff0c;该模型于2023年12月完成训练&…

微软Microsoft Surface Go 2

1个小玩具 Microsoft Surface Go 2的评测结果出炉&#xff01;它是目前最好的中端Windows 二合一笔记本平板。 外形简洁小巧&#xff0c;工作娱乐两不误。 它有多个版本。 我们测试的是配备8GB Ram和128GB SSD的Pentium 4425Y处理器&#xff08;第8代&#xff09;的型号。 S…

力扣242. 有效的字母异位词

思路&#xff1a;字母相互抵消的思路&#xff0c;本题字符串中只包含小写字母26位&#xff0c;那就新建record数组int[26]&#xff0c;下标0-25&#xff0c;代表小写字母a-z, 需要通过 某字符减a 来达到这一目的&#xff1b; class Solution {public boolean isAnagram(String…