嵌入式开发问题排查小技巧
自己编写日志打印程序 有源码的 C语言日志控制Zlog日志框架
IAP&OTA远程升级(flash分区)
RTOS (stm32的操作系统)
一般会选择Freertos(国外) RT-Thread(国内)
看做是一个软件包:帮助实现任务管理 时钟管理 内存管理 消息通讯
怎么学习freertos
使用STM32CubeMX5.3.0构建初始化模板 然后用keil5进行汇编
任务控制函数
xTaskCreate
vTaskDelete
任务状态切换
vTaskSuspend
vTaskResume
系统时钟管理
Systick系统节拍定时器
相对延时函数:vTaskDelay()
绝对延时函数:vTaskDelayUntil()
系统内存管理
普通stm32使用malloc()和free()
当RTOS内核需要ARM时
调用pvPortMalloc()函数来代替malloc()函数
当RAM要被释放时
调用vPortFree()函数来代替free()函数
信号量&互斥量:创建、获取、释放、删除
信号量用于同步,任务间或者任务或中断间同步
互斥量用于互锁,用于保护同时只能有一个任务访问的资源,为资源上一把锁
消息队列
任务级队列处理函数
中断级队列处理函数(带中断保护)已经在CMSIS接口中封装
但写入生产速度比消费速度快的时候,容易出现数据被覆盖
邮箱队列:创建、发送、接收、查询、删除
osmessagePut()消息队列处理函数
嵌入式linux
单片机和RTOS完成不了的,智能音箱,售货机,车载系统,都要用到linux或安卓系统的开发,
开发环境:Windows主机+linux虚拟机:使用VMwareWorkstation部署虚拟机
linux开发指令
linux工程搭建
文件量少:Makefile
文件量大:autotools cmake(重点)
Cmake是用来makefile的一个工具:读入所有源文件之后,自动生成makefile。
然后使用visual studio code汇编(只是在这里面写程序而已)
cmake工程基本语法
linux c 多线程开发
- shell脚本创建:使用run.sh命令就能直接完成编译
- 多线程thread使用
- cmake创建
线程通讯&同步 linux c
互斥锁
确保同一时间只能有一个线程访问共享资源。当锁被占用时试图对其加锁的线程都进人阻塞状态(释放CPU资源使其由运行状态进人等待状态)。当锁释放时邪个等待线程能获得该锁取决于内核的调度。eg:两个线程同时a++
读写锁
当以写模式加锁而处于写状态时任何试图加锁的线程(不论是读或写)都阻塞,当以读状态模式加锁而处于读状态时“读”线程不阻塞,“写”线程阻塞。读和读互不影响,读和写互斥,写和写互斥。安全 提高效率
条件变量
可以以原子的方式阻塞进程,直到某个特定条件为真为止。对条件的测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用。安全+进一步提高效率
自旋锁
上锁受阻时线程不阻塞而是在循环中轮询查看能否获得该锁,让等待锁的线程处于忙等待状态,没有线程的切换因而没有切换开销,不过对CPU的霸占会导致CPU资源的浪费。
所以自旋锁适用于并行结构(多个处理器)或者适用于锁被持有时间短而不希望在线程切换产生开销的情况。
互斥&读写&条件
1线程等待锁的时间较长
2.单核处理器
3.临界区有IO操作
4.临界区操作复杂或者有大量循环
5.临界区竞争非常激烈
自旋
1.线程等待锁的时间短
2.加锁的代码(临界区)频繁被访问,竞争不激烈
3.cpu资源不紧张
4.多核处理器
信号量机制(Semaphore):包括无名线程信号量和命名线程信号量
信号机制(Signal):类似进程间的信号处理
信号量&互斥量=同步&资源保护
1、检测按键信号、处理按键事件用信号量
2、 任务从缓存区读出需要处理的订单,需要用互斥量
linux c 多进程
什么是进程?
什么时候用进程&线程?
1、需要频繁创建销毁的优先使用线程;因为对进程来说创建和销毁一个进程代价是很大的。
2、线程的切换速度快,所以在需要大量计算,切换频繁时用线程,还有耗时的操作使用线程可
提高应用程序的响应。
3、多进程可以使用在多机分布式系统,需要扩展到其他机器上,使用多进程,多线程适用于多
核处理机。
4、需要更稳定安全时,适合选择进程,空间独立;需要速度时,选择线程更好。
linux c 多进程 创建多进程方法 进程通信方式
1.管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信:
2.信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身:Iinux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数):
3.队列(消息队列):消息队列是消息的链接表,包括Posixi消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。
4.共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通
信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。
5.信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。
6.套接口(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和System V的变种都支持套接字。(多机分布 咱们就用这个)
linux文件编程
linux一切皆文件,io/iic/hid ——> Open close read write
linux 网络编程 socket
为什么需要socket
简单的通讯->串口
少量设备通讯->iic地址线 128 个子设备
少量设备通讯->485 modbus 256 通讯
大量设备->tcp/ip
socket是对tcp/ip协议的封装和应用
HTTP HTTPS MQTT等都是基于socket的
linux开源框架
===================================================================
FastDFS、
redis 和mysql
nginx 、QListWidget 和 QJsonDocument
FastCGI (nginx中配置fastcgi)、
qt
====================================================================
LNMP架构体系(Linux+Nginx+ MySQL+PHP)架构
====================================================================
对硬件传递过来的数据进行解码
采集数据时需要考虑性能
首先,采集到的数据不会直接处理,而是通过消息队列发送到队列中排队,再去依次消费
其次 对于采集来的数据,需要给他设置单位,阈值,这些数据我们不会从数据库比对,我们需要放入缓存,当采集来数据的时候,我们就跟缓存中的数据进行比较
再次,当数据库的数据做了修改,需要同时把缓存中的数据一起更新
把byte[]序列化成base64字符串后,再放json里传输就可以了
需求:硬件传递过来的数据时byte数组,需要我们转换成16进制,然后按照通信规则进行解析
还要把spring字符串变成integer字符串
解析数据
根据第二位数据位判断
(这些应该放在边缘计算里面)
从数据库把数据查出来放到前端
提供当前时间点之前的10条数据
程序给硬件发指令实现对传感器的远程控制
可以把开发快换成Emqtt 好像都一样 都是一个第三方服务器 (考虑mqtt的优势所在)
mqtt boker 就是通讯管理服务器
传感器阈值设计
在系统中设置传感器采集到的数据的最小最大值,超出阈值报警、短信、电话、邮件
Linux mysql自动备份与数据恢复 Crontab
域名申请:推荐使用阿里云的万网域名申请
个人注册 需要身份证
搜索你想要注册的域名。并且进行购买,花钱的事非常容易
支付宝扫码付款,新用户有优惠券
注册完的域名不能使用,根据监管局要求要备案。
需要阿里云给你邮寄网站的背景贴纸,你站在贴纸上,拍照、 上传 、打印承诺书、 签字 、上传
然后等待阿里云客服给你打电话确认
急不得,出了什么问题按照要求更改
layUI沙盘模拟设备信息传输