嵌入式软件开发
文章平均质量分 70
天城寺电子
成都某末流985在读计算机硕士,关注嵌入式软件/硬件、机器人、单片机/FPGA、QT/Android上位机、可见光通信、机械设计等领域。
展开
-
ARM-Cortex-M架构:1、STM32函数参数传递
如果函数的参数超过 4 个,或者参数很大(如结构体或数组等),无法完全放入寄存器中,那么超过部分的参数会被压入堆栈。堆栈传递参数时,参数按照从右到左的顺序压入堆栈。在调用子函数时,ARM Cortex-M3 处理器可以使用 寄存器 和 堆栈 来传递参数。这是因为使用寄存器传递参数比使用堆栈更快,访问寄存器的速度比访问内存(堆栈)要快。如果参数的数量小于或等于 4,那么这些参数都会通过 R0 到 R3 传递。如果参数的数量大于 4,则超过的参数将通过堆栈传递。原创 2024-08-27 01:25:59 · 1015 阅读 · 0 评论 -
CMSIS OS版本V1和V2区别
- CMSIS-OS(Common Microcontroller Software Interface Standard - Operating System)是一种通用的嵌入式操作系统接口标准。它旨在简化微控制器软件开发,为开发人员提供一致且高效的接口。- 其版本有V1和V2的区别,如果使用的函数是cmsis_os.h,就是v1版本。如果是cmsis_os2.h,就是v2版本。原创 2024-07-29 16:01:44 · 557 阅读 · 0 评论 -
工业控制:CANOpen(控制器局域网络)协议快速学习
- 目前很多CANOpen介绍的文章比较繁琐,讲很多历史由来,虽然更方便读者了解原委,但对于快速上手是不合适的。- 本文介绍了为什么CAN通信需要终端负载电阻。- 本文简单直接,默认大家都熟悉CAN协议,在此基础上快速对CANOpen协议进行学习。原创 2024-07-17 20:51:25 · 1470 阅读 · 1 评论 -
STM32开发:1、使用VSCode + CMake + Ninja + CubeMX编译代码
- 传统STM32开发常用keil,keil同时集成了代码编辑、文件编译、调试的功能,用起来方便快捷。- 但是,keil为付费软件,在版权要求较为严格的场景中不适用。且Keil不可以跨平台使用,还存在代码提示不完善、界面功能老旧的问题。- 因此,本文将和读者一起了解STM32代码编译的原理,使我们更深刻得理解STM32从c文件代码到hex烧录文件背后的原理,拓宽自己的技术栈。原创 2024-07-08 17:12:26 · 2041 阅读 · 0 评论 -
FreeRTOS:1、任务通知vTaskNotifyGiveFromISR保证实时性
- 这里我们讲了FreeRTOS中任务通知vTaskNotifyGiveFromISR的用法。- 由于FreeRTOS是高实时性的系统,因此我们可以看到,在中断退出时,为了保证被通知的任务及时运行,因此需要检查是否需要立即进行任务切换。如果被通知的任务没有更高的优先级,那么在退出中断后不会立即进行任务切换。FreeRTOS 设计的一个关键点就是只在有必要的时候进行任务切换,以保持系统的效率和响应性。- portYIELD_FROM_ISR的作用是从ISR中请求一次上下文切换。具体来说,如果中断服务例程导原创 2024-06-20 23:46:59 · 662 阅读 · 0 评论 -
STM32 HAL库串口使用printf
在我们使用CubeMX生成好STM32 HAL库工程之后,我们想使用printf函数来打印一些信息,配置如下:原创 2023-10-23 14:27:57 · 1003 阅读 · 2 评论 -
计算机/嵌入式入门教材资料
自学计算机,首先我们要找到好的教材、教程,可以事半功倍。目前,互联网上计算机资源较多,难的不再是寻找资源,而是筛选出质量比较高的资源。基于笔者经验,推荐以下资源。原创 2023-09-01 14:24:06 · 336 阅读 · 0 评论 -
在CMD脚本中生成空心字
在CMD脚本中生成空心字原创 2023-08-28 21:17:51 · 262 阅读 · 0 评论 -
单片机UART一对多:同时读取多个传感器基于modbus协议
modbus介绍可以参考如下:https://cloud.tencent.com/developer/article/1540241简而言之,在串口中使用modbus协议,主机需要先发送要读取的设备编号,相应设备编号的设备回传主机要读取的数据,而不符合该设备编号的设备保持静默状态。原创 2023-08-24 16:28:54 · 4590 阅读 · 10 评论 -
GIT常用命令汇总
git常用操作指南。新手学习git指南。新手快速入门git原创 2023-07-17 10:45:58 · 641 阅读 · 0 评论 -
Android Studio添加EasyPemissions
按照EasyPermissions主页描述的那样添加完依赖后,在程序中使用还是报错:Failed to resolve: pub.devrel:easypermissions:0.3.0首先,EasyPemissions属于别人的开源库,我们想使用的话,必须让编译器知道去哪里找这个开源库。这个开源库位于github上,但是编译器需要知道去这里找,因此我们首先需要配置build.gradle然后,接着:然后:就好了。EasyPermissions官网AndPermissionsAndPe原创 2023-04-21 22:44:57 · 302 阅读 · 1 评论 -
嵌入式Android开发 1:Android studio环境搭建
2023年最新版Android studio安装教程,附安装后测试结果。原创 2023-03-31 17:29:12 · 2405 阅读 · 0 评论 -
嵌入式学深度学习:1、Pytorch框架搭建
深度学习是机器学习的一种,目前深度学习应用场景较多.在嵌入式领域也经常会用到普通传感器无法检测、而用机器视觉能很方便完成的任务,比如流水线检测、无接触姿态检测等。而传统的计算机视觉要求使用者掌握图像处理的基本知识,较为复杂,而采用深度学习的图像处理则要求较低。因此,嵌入式工程师如果能掌握深度学习的应用方法,无疑会给自己的项目研发带来很大便利。这里介绍了深度学习框架Pytorch的环境搭建,帮助各不熟悉深度学习的嵌入式工程师们入门深度学习。原创 2023-03-18 20:42:24 · 2816 阅读 · 2 评论 -
MQTT服务器搭建和ESP32实现MQTT代码
MQTT服务器搭建和ESP32实现MQTT代码,使用PubSubClient.h库原创 2022-03-17 18:43:26 · 18932 阅读 · 3 评论 -
KEIL MDK编译速度慢解决方法
在keil MDK中,我发现有的工程编译速度很慢,而有的工程编译速度很快,编译速度慢的工程在编译时就很浪费我们时间。原创 2021-12-03 19:47:47 · 8940 阅读 · 0 评论 -
操作系统内核代码中字节对齐temp &= 0xfffffff8;解析
文章目录1.说明:2.解析:3.将其改为4字节对齐:1.说明:在操作系统内核代码中,对于任务堆栈有如下操作:temp &= 0xfffffff8;2.解析:这一句话的作用是让堆栈进行8字节对齐。关于字节对齐的概念如下:参考:https://blog.csdn.net/cclethe/article/details/79659590并且在《M3权威指南》中,我们可以查得堆栈指针必须4字节对齐,3.将其改为4字节对齐:temp &= 0xfffffff8;作用是8字原创 2021-06-13 11:34:10 · 1336 阅读 · 0 评论 -
Raw-OS操作系统内核代码汇编部分cpu.asm分析
文章目录和汇编文件相关的头文件部分:和汇编文件相关的头文件部分:#ifndef RAW_CPU_H#define RAW_CPU_H unsigned int OS_CPU_SR_Save(void);//上述函数是用来读取Restore时保存进R0的PRIMASK的值。//关于PRIMASK,PRIMASK是只有1个位的寄存器,用于屏蔽中断void OS_CPU_SR_Restore(unsigned int sr);原创 2021-06-11 22:54:50 · 1025 阅读 · 3 评论 -
unsigned int OS_CPU_SR_Save(void)分析
文章目录说明:说明:在操作系统内核代码里,进入、退出临界代码如下:unsigned int OS_CPU_SR_Save(void);void OS_CPU_SR_Restore(unsigned int sr);#define RAW_SR_ALLOC() unsigned int cpu_sr = 0 #define USER_CPU_INT_DISABLE() {cpu_sr = OS_CPU_SR_Save();}#define US原创 2021-06-11 19:42:59 · 1630 阅读 · 2 评论 -
Cortex-M3/M4内核STM32的LR寄存器和PC寄存器
怎么指定STM32跳转到指定地址?为什么LR寄存器和PC寄存器差1?goto原理?STM32启动文件怎么跳转到main的?LR寄存器存的是:执行子函数后,PC指针应该跳转回去的地方。原创 2021-06-11 15:32:07 · 11148 阅读 · 10 评论 -
有了Systick中断为什么还要PendSV中断?
文章目录问题:原因:1.在SysTick中断里完成任务切换会降低操作系统的实时性:问题:看过Cortex-m3/m4操作系统RTOS内核代码的伙伴们都知道,OS中的任务调度实现方式如下:1、开启SysTick中断,也就是系统滴答定时器中断。然后在SysTick中断中触发PendSV中断,实际的任务切换是在PendSV的中断服务函数中完成的。2、PendSV的中断服务函数一般用汇编来写。那为什么不直接在SysTick的中断服务函数里完成任务切换呢?其中原因如下:原因:1.在SysTick中断里原创 2021-06-11 13:38:57 · 8542 阅读 · 16 评论 -
RTOS内核代码中LDM R0, {R4-R11}理解
在RTOS的内核代码中汇编部分,有 LDM R0, {R4-R11}LDM是32为存储器数据传送指令,但其传送方向刚好的LDR相反。LDR a b是把数据从b传到a里,LDM则恰相反。 LDM R0, {R4-R11}; ;//这条指令实现的功能是:把R0所指地址中的数据批量的拷贝到R4-R11寄存器中。因R4到R11都是32位寄存器,共4*8=32个字节...原创 2021-06-10 16:43:57 · 1211 阅读 · 0 评论 -
双向链表-C语言实现结构体双向链表
文章目录说明说明双向链表作为链表数据结构的一种,使用广泛且方便,特别是在操作系统内核的任务调度中。用C语言实现一般的双向链表比较简单。如下:typedef struct LIST{ struct LIST *next; struct LIST *previous; int32_t Data;} LIST;inline void ListInit(LIST *list_head){ list_head->next = list_head; list_head->pr原创 2021-06-09 22:57:04 · 1271 阅读 · 2 评论 -
Raw OS源码中的raw_list_entry(node, type, member)分析
文章目录说明分析说明在看Raw OS的源代码时,在raw_list.h里面有如下宏定义:#define raw_list_entry(node, type, member) ((type *)((RAW_U8 *)(node) - (RAW_U32)(&((type *)0)->member)))乍一看这个宏定义有点复杂,其实只要按部就班的分析,是很好理解的。我们看调用此宏定义时传进来的形参是什么,全局搜索此宏定义,发现在void tick_list_update(void)原创 2021-06-09 22:06:31 · 600 阅读 · 0 评论