技术标签: 嵌入式面试
如需转载请注明出处:https://juyou.blog.csdn.net/article/details/116021595
参看:STM32开发 – STM32初识
内核不同:F1是Cortex-M3内核,F4是Cortex-M4内核;
主频不同:F1主频72MHz,F4主频168MHz;
浮点运算:F1无浮点运算单位,F4有;
功能性能:F4外设比F1丰富且功能更强大,比如GPIO翻转速率、上下拉电阻配置、ADC精度等;
内存大小:F1内部SRAM最大64K,F4有192K(112+64+16)。
参看:STM32开发 – 启动流程
通过Boot引脚设定,寻找初始地址
初始化栈指针 __initial_sp
指向复位程序 Reset_Hander
设置异常中断 HardFault_Handler
设置系统时钟 SystemInit
调用C库函数 _main
参看:STM32开发 – GPIO详解
GPIO 8种工作模式(gpio_init.GPIO_Mode):
(1) GPIO_Mode_AIN 模拟输入
(2) GPIO_Mode_IN_FLOATING 浮空输入
(3) GPIO_Mode_IPD 下拉输入
(4) GPIO_Mode_IPU 上拉输入
(5) GPIO_Mode_Out_OD 开漏输出
(6) GPIO_Mode_Out_PP 推挽输出
(7) GPIO_Mode_AF_OD 复用开漏输出
(8) GPIO_Mode_AF_PP 复用推挽输出
APB2负责 AD,I/O,高级TIM,串口1。
APB1负责 DA,USB,SPI,I2C,CAN,串口2345,普通TIM,PWR
GPIO框图剖析:
参看:STM32-GPIO详解
参看:STM32开发 – 串口详解
应用场景:GPS、蓝牙、4G模块
参看:STM32开发 – PMIC、I2C详解
硬件模式: 是有通信速率设置的
/* STM32 I2C 快速模式 */
#define I2C_Speed 400000
/* 通信速率 */
I2C_InitStructure.I2C_ClockSpeed = I2C_Speed;
软件模拟: 没有设置通信速率,该怎么计算呢?
通过I2C总线位延迟函数 i2c_Delay:
static void i2c_Delay(void)
{
uint8_t i;
/*
下面的时间是通过安富莱AX-Pro逻辑分析仪测试得到的。
CPU主频72MHz时,在内部Flash运行, MDK工程不优化
循环次数为10时,SCL频率 = 205KHz
循环次数为7时,SCL频率 = 347KHz, SCL高电平时间1.5us,SCL低电平时间2.87us
循环次数为5时,SCL频率 = 421KHz, SCL高电平时间1.25us,SCL低电平时间2.375us
IAR工程编译效率高,不能设置为7
*/
for (i = 0; i < 10; i++);
}
应用场景:PMIC、加速度计、陀螺仪
参看:STM32开发 – W25Q32JV SPI FlASH详解
参看:详解SPI中的极性CPOL和相位CPHA
应用场景:SPI Flash,W25Q32 存储器容量 32Mb (4M x 8),即4M byte
一个比较重要的函数,获取当前剩余数据量大小,根据设置的接收buff大小减去当前剩余数据量 ,得到当前接收数据大小。
一个任务,也称作一个线程。
UCOS有一个任务调度机制,根据任务的优先级进行调度。
一个是硬件中断, 那么系统会将当前任务有关变量入栈,然后执行中断服务程序,执行完成后出栈返回.
另一个是任务之间的切换,使用的方法就是任务调度,每一个任务有自己的栈,顺度也是一样的入栈,然后执行另一个程序,然后出线返回。
并非是每一任务按优先级顺序轮流执行的,而是高优先级的任务独占运行,除非其主动放弃执行,否则低优先级任务不能抢占,同时高优先级可以把放出去给低优先级任务使用的CPU占用权抢回来。所以ucos的任务间要注意插入等待延时,以便ucos切出去让低优先级任务执行。
在UCOSII中,是使用信号量、邮箱(消息邮箱)和消息队列这些被称作事件的中间环节来实现任务间的通信的,还有全局变量。
信号量:
参看:ucosII 信号量使用总结(举例讲解)
信号量用于:
1.控制共享资源的使用权(满足互斥条件)
2.标志某时间的发生
3.使2个任务的行为同步
应用实例:互斥信号量
作为互斥条件,信号量初始化为1。
实现目标:调用串口发送命令,必须等待返回“OK”字符过后,才能发送下一条命令。每个任务都有可能使用到此发送函数,不能出现冲突!
邮箱(消息邮箱):
消息队列:
概念:
(1)消息队列实际上就是邮箱阵列。
(2)任务和中断都可以将一则消息放入队列中,任务可以从消息队列中获取消息。
(3)先进入队列的消息先传给任务(FIFO)。
(4)每个消息队列有一张等待消息任务的等待列表,如果消息列中没有消息,则等待消息的任务就被挂起,直到消息到来。
应用场景:
串口接收程序中的接收缓冲区。
储存外部事件。
了解过Modbus协议。
结构为:帧头(SDTC)+帧长度+指令+流水号+数据+CRC校验。
μC/OS-II是专门为计算机的嵌入式应用设计的,μC/OS-II 具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点, 最小内核可编译至 2KB 。μC/OS-II 已经移植到了几乎所有知名的CPU 上。
linux 免费,安全,稳定,应用范围广,在嵌入式上,服务器上,家用机,都有广泛应用。
μC/OS-II Linux 都适合用在嵌入式上。但μC/OS-II 是专为嵌入式而设计,这样的结果是,运行效率更高,占用资源更少。
linux 都可以用作服务器上,使用率高。linux 虽然不是专门针对服务器而开发,但其源码公开,完全可以修改,使得两者差异不大,最主要的发行版redhat linux 就是在服务器上用得很多的系统。
1、显示工作路径下已修改的文件:
$ git status
2、进入修改文件目录:
$cd -
3、显示与上次提交版本文件的不同:
$ git diff
4、把当前所有修改添加到下次提交中:
$ git add .
5、添加相关功能说明,(第一次提交使用这个)
$ git commit -s
其中还要注明:
Fuction: 修改代码的功能
Ticket: 对应Bug号
注意: 每一个文件夹下都要重新提一次。
6、查看提交代码
$ tig .
7、请勿修改已发布的提交记录! (以后提交使用这个)
$git commit --amend
命令模式下:
:x ( 写入文件并退出)
8、推送到服务器
$ git push origin HEAD:refs/for/master
ucosii和freeRTOS比较:
(1)freeRTOS只支持TCP/IP, uCOSii则有大量外延支持,比如FS, USB, GUI, CAN等的支持。(我们用于tbox要用到CAN,所以选择uCOSii)
(2)freeRTOS 是在商业上免费应用。uCOSii在商业上的应用是要付钱的。
(3)任务间通讯freeRTOS只支持队列, 信号量, 互斥量。 uCOSii除这些外,还支持事件标志组,邮箱。
(4)理论上讲,freeRTOS 可以管理超过64个任务,而uCOSii只能管理64个。
ucosii和ucosiii比较:
那么从μC/OS-II到μC/OS-III有哪些不同的地方呢?增加了什么,我们看改动还是很大的。一个是原来只有0~63个优先级,而且优先级不能重复,现在允许几个任务使用同一个优先级,在同一个优先级里面,支持时间片调度法;第二个是允许用户在程序运行中动态配置实时操作系统内核资源,比如,任务、任务栈、信号量、事件标志组、消息队列、消息数、互斥型信号量、存储块划分和定时器,可以在程序运行中变更。这样,用户可以避免在程序编译过程中出现资源不够分配的问题。在资源复用上,也做了一些改进。μC/OS-II中,最多任务数有64个,到了版本2.82以后是256个,μC/OS-III中,用户可以由任意多的任务、任意多的信号量、互斥型信号量、事件标志、消息列表、定时器和任意分配的存储块容量,仅受限于用户CPU可以使用的RAM量。这个也是一个很大的扩展。(问:邵老师,它的这个数是启动时就固定的,还是启动后随便定?)它是配置的时候可以自由定义的,只有你的RAM足够大的话。第四点是增加了很多功能,功能总是越来越多的,大伙可以看一下的。原来这些功能在μC/OS-II里面是没有的。
参看:STM32开发 – 低功耗模式详解(1)
参看:STM32开发 – 低功耗模式详解(2)
参看:STM32开发 – 低功耗模式详解(3)
分三层,物联网从架构上面可以分为感知层、网络层和应用层,
(1)感知层: 负责信息采集和物物之间的信息传输,信息采集的技术包括传感器、条码和二维码、 RFID射频技术、音视频等多媒体信息,信息传输包括远近距离数据传输技术、自组织组网技术、协同信息处理技术、信息采集中间件技术等传感器网络。感知层是实现物联网全面感知的核心能力,是物联网中包括关键技术、标准化方面、产业化方面亟待突破的部分,关键在于具备更精确、更全面的感知能力,并解决低功耗、小型化和低成本的问题。
(2)网络层: 是利用无线和有线网络对采集的数据进行编码、认证和传输,广泛覆盖的移动通信网络是实现物联网的基础设施,是物联网三层中标准化程度昀高、产业化能力昀强、昀成熟的部分,关键在于为物联网应用特征进行优化和改进,形成协同感知的网络。
(3)应用层: 提供丰富的基于物联网的应用,是物联网发展的根本目标,将物联网技术与行业信息化需求相结合,实现广泛智能化应用的解决方案集,关键在于行业融合、信息资源的开发利用、低成本高质量的解决方案、信息安全的保障以及有效的商业模式的开发。
系统通过与内存分区相关联的内存控制块来对内存分区进行管理。
动态内存管理函数有:
创建动态内存分区函数OSMemCreate();
请求获得内存块函数OSMemGet();
释放内存块函数OSMemPut();
有5种状态:
睡眠状态、就绪状态、运行状态、等待状态(等待某一事件发生)和中断服务状态。
UCOSII任务的5个状态转换关系:
参看:STM32开发 – HardFault_Handler处理
参看:Cortex-M3和Cortex-M4 Fault异常应用之一 ----- 基础知识
(1)使用unicode编码合成声音
AT+CTTS=1,”6B228FCE4F7F75288BED97F3540862107CFB7EDF”
内容是“欢迎使用语音合成系统”,模块收发中文短信就是unicode编码,所以很容易将短信朗读出来;
(2)直接输入文本,普通字符采用ASIIC码,汉字采用GBK编码。
AT+CTTS=2,”欢迎使用语音合成系统”
参看:STM32开发 – Systick定时器
通过SysTick_Config(SystemCoreClock / OS_TICKS_PER_SEC))//1ms定时器
其中:
uint32_t SystemCoreClock = SYSCLK_FREQ_72MHz; /*!< System Clock Frequency (Core Clock) */
#define SYSCLK_FREQ_72MHz 72000000
#define OS_TICKS_PER_SEC 1000 /* Set the number of ticks in one second
如果需要20ms则,可以通一设置一个全局变量,然后定初值得为20,这样,每个systick中断一次,这个全局变量减1,减到0,即systick中断20次,时间为:1ms*20=20ms。从而实现20ms的定时。
使获得信号量任务的优先级在使用共享资源期间暂时提升到所有任务最高优先级的高一个级别上,以使该任务不被其他任务所打断,从而能尽快地使用完共享资源并释放信号量,然后在释放信号量之后,再恢复该任务原来的优先级别。
有限状态机,(英语:Finite-state machine, FSM),又称有限状态自动机,简称状态机。
参看:有限状态机FSM详解及其实现
假设状态机的状态转换由下表所示:
实现:(使用switch语句)
//横着写
void event0func(void)
{
switch(cur_state)
{
case State0:
action0;
cur_state = State1;
break;
case State1:
action1;
cur_state = State2;
break;
case State2:
action1;
cur_state = State0;
break;
default:break;
}
}
void event1func(void)
{
switch(cur_state)
{
case State0:
action4;
cur_state = State1;
break;
default:break;
}
}
void event2func(void)
{
switch(cur_state)
{
case State0:
action5;
cur_state = State2;
break;
case State1:
action6;
cur_state = State0;
break;
default:break;
}
}
文章浏览阅读791次。基于ECS和NAS搭建个人网盘体验地址:https://developer.aliyun.com/adc/scenario/bd0643a87c3e4cde8b488a56850df181场景体验目标本场景将提供一台配置了CentOS 7.7的ECS实例(云服务器)和创建好的NAS文件存储系统。通过本教程的操作,您可以基于已有的环境快速搭建一个个人网盘。体验此场景后,可以掌握的知识有:NAS文件存储系统基本知识Apache + PHP语言环境的安装和部署挂载NAS文件存储系统_在线建立私人空间的方法
文章浏览阅读5.2k次,点赞2次,收藏20次。在家是不是看网课看的比较烦躁?我就是,在家看学习通课程看的烦躁,想着用代码刷课程,写了一天终于写出来了(狗头开心)。这里对于selenium库就不详细解释,包括chrome浏览器的配置等问题应该能百度到。不多说直接上代码。等下再粗略解释一下每部分。每一部分要详细解释,篇幅太长了,现在是深夜,熬不住了。from selenium import webdriverimport timefrom..._网络课程python
文章浏览阅读3.8k次,点赞7次,收藏42次。前言很多学生会在编程、设计或其他时候可能使用到【制图工具】。最好用的莫不过【微软的Visio】了。但是很多学生不会使用Visio,甚至不会安装Visio。 > Visio 这么好的工具,一定要会用。 今天,作者写一份教程,教会大家了解如何安装和使用 ==Visio==。 在正式教程之前,我们先介绍 Visio。 Visio 是offic..._visio安装教程
文章浏览阅读601次。转载至https://blog.csdn.net/zhangman0702/article/details/93628954在"./configure"配置中,"–with"表示启用模块,也就是说这些模块在编译时不会自动构建"–without"表示禁用模块,也就是说这些模块在编译时会自动构建,若你想Nginx轻量级运行,可以去除一些不必要的模块。[root@localhost nginx-1.14.0]# ./configure --help => 查看安装配置项--hel_nginx中./configure
文章浏览阅读1.8k次,点赞3次,收藏10次。概述DNS服务器里面有两个区域,即“正向查找区域”和“反向查找区域”,正向查找区域就是通常所访问的域名去解析地址,反向查找区域即是IP反向解析,它可以作用是通过查找IP地址的PTR记录来得到该IP地址指向的域名。要成功得到域名就必须有该IP地址的PTR记录。PTR记录是邮件交换记录的一种,邮件交换记录中有A记录和PTR记录,A记录解析域名到地址,PTR记录解析地址得到对应的域名。DNS正向解析..._dns可以双向查询吗
文章浏览阅读2.1w次,点赞6次,收藏70次。1. 问题描述在使用由Matlab GUI开发的工具软件时,常常会遇到如下问题:Could not find version 9.1 of the MATLAB Runtime. Attempting …2. 解决方案在官网下载对应版本的编译器:(示例为Runtime 9.1)将编译器安装到如图所示的路径下:. 重新启动软件即可..._could not find version 9.13 of the matlab runtimeattempting to load mclmcrrt
文章浏览阅读307次。0x01 漏洞描述ApacheFlink是一个开源的流处理框架,具有强大的流处理和批处理功能。Apache Flink 1.11.0(以及1.11.1和1.11.2中发布的)中引入的更改允许攻击者通过JobManager进程的REST接口读取JobManager本地文件系统中的任何文件。0x02 影响版本Flink 1.11.0、1.11.1、1.11.20x03 漏洞复现简单验证:读取该文件可直接判断是否存在漏洞http://192.168.1.1:8081/jobmanager/logs/_apache flink 目录遍历漏洞 cve-2020-17519
文章浏览阅读97次。第一发布文章时,遇到的问题,发布时弹出 ‘请勿使用默认栏’,改下面这框里文字为标题就OK了_add to the trusted site list ie浏览器
文章浏览阅读156次。在初始种群中,所有蜜蜂都是侦查蜜蜂,它们从规定的搜索空间中选择位置。聚集蜜蜂在新位置周围的领域内搜索,侦查蜜蜂则返回搜索空间的一个新位置。其中一种基于差分进化的算法是差分蜂群优化算法(DFOA),它模拟蜜蜂群饲料搜索过程,使用差分策略来更新蜜蜂位置,以实现全局最优解搜索。在差分进化算法中,初始种群由 n 个个体组成,每个个体包含 D 个维度,可以表示为。因此,在搜索空间 [L,U] = [-2,-2] 至 [2,2] 内,Rosenbrock 函数的全局最小值为 4.2776e-06。U = [2,2];_dfo优化
文章浏览阅读819次。Linux下printf输出彩色文字语法举例多行输出?应用规范最近学习了printf输出彩色字体的方法,来给大伙分享一下语法\033[ A1;A2;A3;…An m这里的An详情请看应用规范中的表格XD举例printf("\033[1;33;41mhello world\n");多行输出?你一定觉得这样就可以了,但是这其实是不对的,因为当你在下面再多输出一行你就会发现问题printf("\033[1;33;41mhello world\n");printf("hello worl_linux打印彩色关键字
文章浏览阅读279次。前言代码中如果if-else比较多,阅读起来比较困难,维护起来也比较困难,很容易出bug,接下来,本文将介绍优化if-else代码的八种方案。优化方案一:提前return,去除不必要的else如果if-else代码块包含return语句,可以考虑通过提前return,把多余else干掉,使代码更加优雅。优化前:if(condition){ //doSomething}else{ return ;}优化后:if(!condition){ return ;}//_map action> actionmappings = new hashmap<>()
文章浏览阅读4.7k次,点赞2次,收藏16次。1. MDIO接口SMI:串行管理接口(Serial Management Interface),也被称作MII管理接口(MII Management Interface),包括MDC和MDIO两条信号线。MDIO是一个PHY的管理接口,用来读/写PHY的寄存器,以控制PHY的行为或获取PHY的状态,MDC为MDIO提供时钟。MDIO原本是为MII总线接口定义的,MII用于连接MAC和PH..._serial management interface