0%

起因

为什么我要说使用这个来开发,因为我们都知道python开发速度快,这一切都是因为有人写好了底层和模块,所以开发速度非常惊人。缺点就是非常明显的消耗资源和低效率。那我为什么还要说这个呢?因为环境变了,大家开始卷嵌入式了,现在已经可以使用高级
语言来开发硬件编码了,那么随着时间的发展,这方面就会边卷,我也是出于学习的态度来了解它,其实大部分情况下,资源还是够用的,除非真的非常稀缺

mricopython

这个可以开发什么呢?
第一个就是ESP32
第二个就是arduion
第三个就是openmv的产品等

编译和烧写

就那arduion和esp32来分析吧,两者在选择好设备和串口之后,就可以直接一键编译,然后一键下载并debug了,它们是通过usb来进行烧写,使用iap来处理的。

代码编写

既然有了python的名字,那么肯定就是使用python的语法来编译的,所以,就是调用模块生成和调用实例,通过实例的成员方法来进行io的控制,中断的处理,外设的功能选择等。然后就是同mcu一样的操作方法了,去做主控该做的事情。

总结

mricoPython可以让所有程序员都可以生成产品,这个目标是远大的,也必然导致内卷。而且它本身的效率也是有问题,虽然python确实是基于c的,但是泛型和容器,那些没有初始化,那些动态的资源,必然导致会消耗更多资源。作为资深的嵌入式开发者,我们对于资源的处理和管理应该非常敏感和仔细才行。

起因

学习mcu的时候,就在想这个板子是怎么联网的,但是当时老师没教,而且我当时学的东西太多了,确实没那么精力去深究,毕竟还没用到

MAC地址

MAC,Media Access Control Address的全称叫做媒体访问控制地址。你可以认为就是硬件地址,这个一般都是集成在cpu中的,少部分是外接的。我们都知道要联网肯定要ip,其实关于MAC并没有强制性要求的。但是mcu中有要求的。

联网流程

首先是CPU,然后就是得到MAC地址,然后通过PHY相当于是芯片外设,然后才可以接上RJ。RJ有RJ11和RJ45,这两个主要是线的数量和速率不同。

配置方法

打开cubemx,点击ETH,然后设置网口即可,其他的不用配置了。可以设置接收中断。反正就和串口一样使用就好了,那些电平变化,数据处理都是硬件搞定了,不需要我去管理了,调用给的回调和API即可完成操作

其他方法

还可以使用qspi来实现联网,这个是什么操作呢?其实看看usb拓展坞上面的网口转usb就知道,其实网口是可以通过ic进行转换的,只要通讯速度跟得上,所以就可以使用并行的usb和spi进行转换操作。

https://doc.embedfire.com/module/module_tutorial/zh/latest/Module_Manual/spi_class/w5500.html
别人写好了驱动,进行引脚修改为了对应的spi调用收发函数,状态判断就可以了。初始化肯定也得有哦。ping成功之后,就可以get去访问了,自然mqtt那些也是可以用的。此时就不用主控去配置网络接口通过spi就能联网。

结语

使用mcu的硬件功能的时候,很多时候都需要配置给一些额外硬件设备。比如硬件iic,就需要外部上拉电阻;网口就要两个硬件来实现电平变化;can和485都需要差分电平芯片;就连串口ttl都最好加一个电平稳定芯片为好。

今天,分享一些快速入门linux驱动的路子。

起因

今天上班摸鱼看linux内核,感觉一下子就醒悟了,一下子就通透了,脑子里面终于有一种OS的感觉,资源的分配啊,线程管理,进程管理,内存管理的思路了。

OS

要知道OS是分等级的
1>.微内核 鸿蒙 QNX、Minix
2>.宏内核 linux windows
3>.混合内核 windows XNU内核
4>.rtos rt-thread freertos ucos
5>.裸坤

而且rtos也是有级别的
POSIX 的RTOS标准
PSE51, PSE52, PSE53, PSE54 共四个级别;
Minimal Real-time System Profile IEEE Std 1003.13 PSE51,基础 RTOS
Real-time Controller Profile IEEE Std 1003.13 PSE52,带有简单的文件系统…等
Dedicated Real-time Profile IEEE Std 1003.13 PSE53,拥有网络功能…等
Multi-Purpose Real-time Profile IEEE Std 1003.13 PSE54,完整的文件系统,带有 Shell 组件…等

1.最简单就是裸机编程了,就是顺序循环判断走下去就完事了。

2.然后就是freeRTOS和ucos了,这个就上一个台阶的难度,但是就是几个api用来用去,规划好每个任务的优先级和工作时间,利用好空闲任务,利用好内存资源,多线程就完事了

3.就是有点难度了,我这边建议学rtt了,因为rtt是仿照linux的,nano版本和标准版本是没有设备树这东西。首先呢,纯应用开发的话,和上面的rtos是差不多的。但是rtt有一个特殊的操作,就是命令行操作。没听错就是命令行,这个其实是uart串口,而且这些命令行没有linux那些的自带信号,比如CTRL+C CTRL+Z可能无法打断,需要手动添加接受结束才行,而且也是拥有驱动开发操作的。

4.linux了,这个就是在上面的基础上面多了一个设备树的东西和平台开发,其他的真差不多了,rtt也是有kconfig和menuconfig的。

5.后面那些就非常复杂了,其实学会linux,如果能够如火纯情,天下无敌

RTT的驱动开发和BSP

rtt标准和nano版本没有设备树,所以,所有功能实现都要依赖BSP,只有正确的驱动开发加上Kconfig,才能搞定BSP。搞stm32开发的时候一般是结合stm32Cube进行的开发,所以,实际上难的东西都没了,就是把那些gpio的复用功能再用init、open、write、read、control、callback、 close这几个函数进行封装。就是类似于linux的file_operations一样。但是这一步,你并没干啥,为什么这么说呢?因为代码是cube生成的,很多时候只要按照官网给的默认配置,进行cube生成代码,rtt就能进行编译,然后自动链接上去,就是rtt没有给你写这些驱动,他们自己以cube为模板进行驱动设计。只需要做的就是find设备,open init 调用那几个api即可,非常人性化。做BSP的就比较麻烦,大家得去gitee上面把rtt下载下来,里面就有一个BSP代码,然后跟着官方的教程走一遍就可以了,这里就不多赘述了。

这上面是硬件驱动,就是很底层基础,但明显不是我们想要的。比如我想要一个独立的led自定义驱动功能。首先,思路,使用了led,那么肯定就是占用一个gpio,那么就要产生依赖和绑定就是menuconfig中一定要有绑定关系。就需要在kconfig中设置一下关系。然后就是编写驱动程序,首先就申请设备,操作集,添加注册。使用的时候,就是find,open ,close,control就够了。编写一个驱动程序即可,使用时候遵循驱动指定的cmd指令就可以实现了。

一般使用rtt都是mcu版本,而且单核为主,多核也有,但是目前是支持多核同构。如果是异构的话,那么可以考虑使用freertos的方案就支持异构多核。如果是smart版本的话,其实就是和linux基本无异了,需要自己编写设备树,需要自己编写驱动代码。今天2024-04-10去到深圳参加了rt的线下会。主要就是为了解决异构问题还有linux与rtos之间的组合,就是大核是linux,小核心通过协议去接收来自大核心的任务和指令,就是dma那种操作。

驱动很多时候都是不需要做的,一般都是做了适配,就算添加,也只是添加一些硬件功能就ok了,也就是cube生成,kconfig修改就可以了。如果说新的国产平台rtt没有支持那么就难搞了,所有驱动和底层都要自己一个一个添加哦。rtt可以实现其他驱动,不过,需要根据范例进行模仿。

结语

加油兄弟们,千万不要呆在自己的舒适区中。不要自我感动和欺骗了。这样只是在加速淘汰自己,他人的堕落,正是推动你向成功的人前进的动力。

起因

今天在菜鸟编程中复习cpp的时候,看到了异常处理。就是try catch throw 三兄弟。python中就是try except else finally raise
两者是很相似的。中间一个个代码如下面所示

异常处理

就是try尝试运行,错误就到catch,catch中进行错误捕捉。还有一个就是throw,这个就是运行的时候,直接抛出错误这个就像人为中断错误,毕竟catch捕捉的东西有限。一旦执行throw就会立刻停止程序。

Const
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include <exception>
using namespace std;

struct MyException : public exception
{
const char * what () const throw ()
{
return "C++ Exception";
}
};

int main()
{
try
{
throw MyException();
}
catch(MyException& e)
{
std::cout << "MyException caught" << std::endl;
std::cout << e.what() << std::endl;
}
catch(std::exception& e)
{
//其他的错误
}
}

为什么会出现Const呢?首先,
const char* a
char* const b
const char* const c
const void * fun()
这四个都是见怪不怪的用法了。
但是我看到一个
const void *what() const throw()
重写throw的功能。如下代码所示

结果如下

MyException caught
C++ Exception

非常有意思,为什么函数还可以const呢 ?const char * what () const throw ()

我去网上和编译实测了一下,发现确实可以的。但是有限制
1.只能是结构体和类里面的成员方法(cpp中类和结构体都可以继承和实现函数的。)
2.只能调用同为const的函数
3.不能修改类里面的成员对象
4.其他函数可以正常调用const修饰了的函数
5.只能调用同为const的实例 如 const A a; 此时就能使用a

结语

大家感兴趣的话,可以去尝试用一下,我个人感觉,这个东西还是有意义,反正内部被修改可以作用一些,返回当前状态的接口上面如return systemTiem.hour;

这个博客的目的是为了让以后的笔记都变成md格式的,txt笔记确实不好。所以记录一下
Typora的用法,方便入门

Typora的使用

标题

自然就是先标题,那就是ctrl+数字,1-6从大到小

代码区域

输入”```”就是了,连按3次,会变成一个代码区域,可以选择语言

分割线
1
2
3
4
5
6
"***"
"---"
"___"
***
---
___
网站跳转超链接
1
"[百度一下](https://www.baidu.com/)"[百度一下](https://www.baidu.com/)
下标
1
~
上标
1
^
高亮
1
2
"==高亮=="
==高亮==
插入图片
1
直接右键选择图片插入即可
快捷键

img

以上图片来自(https://zhuanlan.zhihu.com/p/515945667)

结语
1
掌握以上主要的几个操作就可以加快编写速度了,我也要去奋斗努力去了,有机会再见

这是一篇关于我刚学习C语言和C++的时候留下来的关于字符串、数组、指针的问题

起因

今天在看python的时候看到一个表达式字符串,这个东西呢,非常奇妙。
举个例子python里面的字符串有

1
2
str1 = " csmznbo "
str2 = ' csmznbo '

可以看到此时的字符串都是有空格,所以下面的那个单引号的明显不对劲,对了。
这个就是shell脚本里面类似的原样输出
特殊字符串。如下例子

1
2
3
4
#bash
str3='The time now is `data`'
#python
str3='The time now is data'.replace('data',str(time.localtime(time.time())))

其实python的””格式的字符串也是可以做到输出像上面的东西的,f”{}”也是可以的(format)
bash的例子只是引出这种字符串的特殊用法原样输出。下面的替换输出,虽然不是同一
功能,但是也能知道遇到这奇奇怪怪的字符串的时候可以联想起来好玩的东西。

但是这个不是今天的主角。

填坑

这个帖子,主要是为了记录我对指针数组还有字符串的理解。首先呢,我之前总是不理解为什么字符串是不可写和不可修改现在知道了,因为它存在静态区中。但是我学了几个月的C语言我才知道了指针不等于字符串,我当时写那些拼接函数,比较函数,裁剪那些,我都是用数组去实现的。但是学的懵懵懂懂的,我甚至都把数组等于字符串,字符串又等于指针去了,因为用起来真的差不多。其实是错误的,虽然汇编是一样当写关于字符串的函数的的时候,传参指针,返回值那些都是天坑。要知道字符串是不能修改的,所以返回值只能是数组和指针,还有就是指针传参就会导致一些问题。比如不知道数据长度等问题。

关系

指针就是指针,指向一个地址,自己指针又有一个属于自己的地址。大小看处理器位数数组就是连续地址的元素组成,可以装指针,数组,结构体,函数等等

C语言中,字符串就是字符串,没别的东西就是全局区的data段中,不可修改的。当时第一次学cpp的时候,把String当成字符串了,当时也好奇为什么字符串又可以删减修改了,其实就是一个容器,不是字符串,你可以认为里面就是一个数组真正的字符串还是””这个,这个还是不能修改即便是cpp。python中字符串也是不能修改的,每一次的修改,都只是新生成一个字符串。并没有修改原本字符串

结语

这次就是一个知识的填坑和巩固罢了果然基础不牢地动山摇。很多时候都是简单的东西罢了。拜拜,下次继续

这是第一篇关于stm32超频芯片锁死的博客

起因

我公司的两个stm32f103芯片板子的晶振不同,我在使用cubeMX生成代码的时候,修改时钟树的时候,没有回车。导致时钟树代码还没配置好,我就直接生成代码了,导致,频率一下子就超了。

后果

代码下载进去之后,就无法使用jflash和vs的debug功能了,就会显示芯片内存不可读取。

修复办法

boot0设为1,boot1设为0.,此时就会进入系统存储器的空间,这里有一段引导程序,而且这段程
序本来就是不可读ROM从一开始就是ST公司写死的东西。然后就奇迹般的发现,flash可以读取了。
然后选择jflash里面的擦除功能把整个芯片删除干净,然后再把boot0设为0就可以了。这个时候代
码可以下载和debug了哦。

读保护和写保护

这个可以代码进行编写,也可以使用ST官方的link软件来进行保护,注意了不要随便使用最高级的都保护哦,一旦操作了就没有回头路了。还可以使用j-flash进行读保护,这个读保护等级是2的,可以多次使用哦。

参考

链接: https://blog.csdn.net/qq_33559992/article/details/105487168

阅读全文 »