嵌入式开发系统学习路线/农业物联网项目实战

发布于:2023-01-13 ⋅ 阅读:(669) ⋅ 点赞:(0)

嵌入式开发问题排查小技巧

 

 

 

 

 

 

 自己编写日志打印程序 有源码的 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沙盘模拟设备信息传输

本文含有隐藏内容,请 开通VIP 后查看