自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

难波儿万的博客

一起学习哈

  • 博客(87)
  • 资源 (1)
  • 收藏
  • 关注

原创 vscode+cmake的STM32单片机调试开发环境

说实话我不是非常喜欢使用Keil MDK进行嵌入式开发。但是,对于STM32等单片机来说MDK的优秀的在线调试功能总是让人喜欢。最让我不喜欢的是MDK的编辑器以及配色。这让我不停的尝试使用Visual Studio Code进行编辑代码然后使用MDK进行编译和调试,就这样我在两个IDE之间来回切换。于是,我进一步厌烦了这种开发方式。于是我决定用cmake来管理和编译工程,在Visual Studio Code来编辑代码。这样我甚至可以在工程中嵌入Python脚本来提高工作效率。

2023-09-23 14:44:59 977

原创 python对逻辑分析仪导出的csv波形数据进行解析

文章目录前言一、逻辑分析仪导出的csv文件的数据导入二、对协议数据解析1.获取高低电平时间间隔2.获取bit流3.根据bit流进行分包处理4.根据bit包获取hex数据总结前言作为一个做嵌入式开发的程序员尤其是做协议栈开发的盆友们经常会使用到逻辑分析仪对电平信号进行分析,不知道有没有遇到和我一样情况的朋友?有时候用逻辑分析仪抓到的波形逻辑分析仪配套的软件不支持对应协议的解析,当我们需要根据波形解出协议数据包时就很难做到了。手动的解析耗时又费力。由于波形数据可以导出成csv文件,所以我就考虑用pytho

2022-01-30 13:23:11 1949

原创 linux 共享内存动态扩展的问题(链表数据保存到共享内存)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、问题描述二、Linux共享内存深入了解1.了解问题的本质才能找到解决问题的最佳方案2.封装一个mallocshm函数实现连表的进程间共享总结前言是的美国大选都到了第三天了,然而吃了几天瓜也没有个结果,导致我吃瓜的热情严重不足。于是我不得不大起精神来思考一下我的问题该如何解决。对了,都二十世纪二十年代了,互联网云计算都发展十多年了。本来一个微信公众号就能解决的事情,美国作为一个世界上唯一的超级大国,选个举居然还要用邮寄

2020-11-07 22:31:43 1486 1

原创 ARM Cortex-M的栈结构及回溯

最近在研究ARM Cortex-M系列的单片机的栈结构及栈回溯。研究这个有什么用呢?深入了解处理器指令、程序运行的原理等知识,对程序设计技能的提高有一定的帮助。当你的程序出现问题了,可以根据栈数据找到出问题的点。有助于问题的查找和定位能力的提高。我的目的就是要搞明白程序在不同状态下调用函数时的压栈顺序是什么?如何在栈中开辟局部变量?为了搞明白这两个问题我查阅了很多资料也借助了许多工具。

2023-05-22 21:48:36 1006 1

原创 关于系统调用app接口进hardfault问题的调试(调试技术)

我们都清楚,这个值本来应该是led_task的任务控制块的地址值,我们再观察一下当前R9寄存器中的值,明显是一个异常的值。由于当前执行再系统的另一个任务中,APP的全局变量的基地址没有保存在R9寄存器中所以出现了寻址错误的问题。在运行APP时将R9寄存器保存下来,在执行退出时先保存当前任务R9寄存器的值然后恢复APP的R9寄存器值,执行退出后恢复当前任务的R9的值。APP的实现很简单,就是创建了一个任务实现了一个LED等的闪烁,APP退出接口就是将任务进行了销毁,其中用到了一个全局变量。

2022-10-17 21:19:23 311

原创 keil导入外部程序功能的妙用(调试技术)

作为一个使用keil开发单片机的嵌入式开发者想必大多数都使用过keil在编译后直接输出bin文件的经历。keil IDE工具在魔法棒(Option for taget ‘xx’)配置功能的User页面运行用户配置执行六条命令。配置界面如下:在编译C/C++文件前执行;在点击编译或重新编译按钮后,在真正开始编译程序前执行命令;在点击编译或重新编译按钮后,将程序编译完成后执行;

2022-10-17 21:15:56 1183

原创 死锁问题的调试(调试技术)

最近工作中遇到一个问题,我决定总结一下死锁的问题。在多线程的系统中经常需要利用锁来实现临界区的保护,但在临界区保护过程中经常出现加锁和解锁没有成对出现的问题。最终,系统进入死锁状态。在bcos中目前还没有实现锁的机制,即便如此任务间的调度最终也会引发临界区的问题。在bcos中解决临界区问题的方法是屏蔽中断,因为系统调度主要依靠中断来实现任务的抢占。如果在进入临界区时屏蔽系统所有中断,在退出临界区时解除中断的屏蔽可以实现类似于锁的功能。

2022-10-17 21:12:03 348

原创 编译器优化导致的问题(调试技术)

在讲编译器优化导致程序问题前先要讲讲什么是编译器优化。不同的C语言编译器都会对程序进行一定程度的优化,每种编译器都会划分几种编译优化等级。不同的优化等级对程序的优化程度不同,有对代码空间的优化,有对执行时间的优化。编译器针对不同问题的优化都是基于某种算法的,但是最终的原则是不能改变用户程序的执行逻辑。在大多数情况下这种优化会提高程序的执行效率及优化代码空间,但是有时编译器也会错误的领会程序员的意图,将一些代码优化后造成不可预测的问题。

2022-10-17 21:00:42 2165

原创 Hardfault调试方法(调试技术)

在单片机调试过程中最让开发者感到头疼的就是遇上Hardfault错误问题了,如何快速的触发问题的原因是解决问题的关键。可是类问题对于比较初级的开发者来说往往没有掌握有效的方法找到是那行代码触发了Hardfault。网上的博客有一些方法解决这类问题,当时讲的又不是很系统,这篇的目的就是系统的讲解一下Hardfault错误的具体定位方法。这篇文章的方法是建立在可以用Keil + Jlink实现在线调试的环境下,请读者注意这个前提条件,其他条件下的定位方法我会在以后的章节中给出。

2022-10-16 11:23:45 844

原创 keil调试工具(调试技术)

目前嵌入式单片机的开发最常用的调试工具就是keil,该IDE软件虽然编辑的功能不受开发者欢迎但是我认为其调试的功能却是非常的优秀。真个我们调试技术这一部分大多数是讲解keil调试工具的使用方法,当然还原其他的一些工具,比如说jlink、逻辑分析仪等。我目前了解到的没有一本书或文章系统的讲解单片机的调试技术的,为了给更多开发者能系统的了解到调试的方法和手段,我这里就自不量力总结一些这方面的内容。

2022-10-16 10:59:28 5263

原创 独立app开发和运行(使用篇)

bcos支持动态加载APP任务到内存中执行,用户应用程序只要调用bcos提供的系统调用就可以实现自己的APP功能。当然,APP的开发需要遵循一些bcos自己的规则。

2022-10-16 10:49:36 2467 1

原创 tasklet的使用(使用篇)

tasklet的实现主要是为了满足嵌入式系统开发过程中经常会遇到定时周期任务、延时任务等需求。在bcos系统中,tasklet在空闲任务中执行,空闲任务在系统中的优先级最低。所以,当系统中没有其他任务执行时,空闲任务会检查tasklet队列中是否有超时的任务需要执行。用户在使用tasklet时一定要注意这一点。tasklet的回调函数的执行与我们预期执行的时间的误差取决于系统中其他线程任务的繁忙程度,当然由于空闲任务的优先级最低,所以在tasklet回调函数执行的过程中可能会被其他高优先级的就绪任务抢占。

2022-10-16 10:46:35 737

原创 延时和任务挂起(使用篇)

在任务中延时和任务挂起是嵌入式操作系统中的常规需求,bcos提供了任务延时和挂起的接口。用户调用任务延时接口和任务挂起任务挂起接口后调用这两个接口的任务会被系统调度到任务等待队列中,直到任务延时超时或用户调研任务恢复函数后才会重新被添加到就绪队列中调度执行。在正常的bcos的使用过程中每一个任务至少要有1ms的延时调用,否则该任务会一直占用cpu的执行权其他任务无法被调度执行。

2022-10-16 10:23:07 254

原创 任务使用(使用篇)

当然,两个任务的优先级尽量不要相同,如果用户创建了两个优先级相同的任务也没关系系统仍然可以正常运行,只是这两个优先级相同的任务如果同时处于就绪状态时其执行顺序是不确定的。另外,对于使用了内存管理模块的用户,bcos系统提供了一种可以动态分配任务控制块和栈空间的任务创建接口,它就是bcos_task_malloc。对于使用bcos_task_malloc创建的任务,任务销毁后任务控制块和栈空间会被释放到内存池中供系统再次使用,可以提高系统的性能。静态创建tcb和栈空间的方式创建任务。

2022-10-16 10:21:52 215

原创 内存管理(使用篇)

bcos的内存管理模块主要是解决用malloc和free两个库函数进行内存申请和释放的过程中内存碎片化的问题。bcos的内存管理模块用链表的方式管理内存池,会自动的将相连的内存空间组合成一整片的内存空间,尽最大的可能减少内存碎片化的问题。

2022-10-16 10:19:57 1019

原创 链表(使用篇)

链表是在程序设计过程中经常使用的数据结构,bcos系统内部的调度和tasklet的实现都是基于链表。所以,对链表的支持是bcos与生俱来的特性。bcos的链表设计参考了Linux内核链表的设计思想,如果用户想使用链表只需要在自己的数据结构中包含链表头,然后便可以开始使用链表来实现自己的数据结构了。下面展示了双向循环链表的所有接口并附有简单的解释。每个接口的参数都易于理解,读者很容易理解并使用接口实现利用双向循环链表进行数据的管理。链表头:初始化链表:链表节点的添加链表节点的删除链表遍历获取链表的第

2022-10-16 10:17:53 105

原创 动态加载APP运行(原理篇)

bcos开发到现在已经可以实现操作系统的基本功能:任务管理、任务调度、简单的内存管理。但是,相比于Windows、Linux似乎缺少了一个动态运行程序的功能。再单片机上能不能实现动态加载和运行程序的功能呢?我思考了一下,想必是可以实现的。想必有的读者使用过MP4这种东西吧?这种东西的成本并不高我猜测他的主控应该使用的是类似于STM32这样的单片机,但是它为什么可以安装多个APP并动态运行呢?肯定是有一些我没有掌握的知识限制了我实现此项功能。功夫不负有心人,我找到了一点相关的资料,简单的实现了相应的功能。

2022-10-16 10:12:28 1252

原创 终端的实现(原理篇)

其实,终端的实现应该放到应用篇的一个示例里面。但是,我实现终端的最初目的是为动态加载APP功能服务的。为了实现动态加载APP的功能我移植了文件系统、实现了终端命令和添加了系统调用的功能。所以,我将终端的实现归入到内核模块中,如果有的应用不需要该功能可以将其裁剪掉。终端是属于人机交互的部分,主要功能是实现用户操作计算机。bcos为了实现简单的人机交互需求也实现了简单的终端功能,用户可以实现自己的终端命令并添加到终端中,这样更方便测试。

2022-10-16 10:01:02 410

原创 文件及文件系统的移植(原理篇)

为了实现动态加载用户程序到RAM中执行的功能,移植一个文件系统是实现路上不可逾越的一道坎。恰恰我用于测试的开发板上有一片空间有8M之多的Flash(W25Q64),当然板子上还有一个SD卡槽。为了节约成本,我决定再现有的Flash上移植Fatfs用来作为系统的文件系统。

2022-10-11 20:08:31 1520

原创 系统调用(原理篇)

bcos其实没有内核层和应用层之间明显的权限限制。但是,在APP与系统代码分开编译的时候每次系统代码编译后APP代码都需要重新编译,这还不是最大的问题。最大的问题是有的系统接口在系统中没有被调用过,keil导出的符号表中就没有对应的接口。基于上面的问题,bcos实现了系统调用的功能以便应用程序更高的使用系统功能。...

2022-08-27 14:47:46 340 3

原创 模块及模块管理(原理篇)

bcos实现了类似于Linux驱动模块的功能,从而实现了驱动模块的解耦,进一步提高了bcos的可移植性。

2022-08-27 14:07:49 250

原创 tasklet的实现(原理篇)

在前面的使用篇已经清晰的描述了tasklet的实现目的与使用方法。本节将重点描述tasklet的实现原理和方法。

2022-08-16 21:17:32 749

原创 系统滴答及Systick定时器

操作系统需要有一个系统的滴答来提供任务管理的时间依据,bcos中的任务延时及tasklet的定时都是依据系统滴答。系统滴答需要一个定时器来提供时间基准,几乎所有的CPU都会提供一个滴答定时器(SYSTICK)来提供给操作系统使用。我们现在使用的STM32也不例外,下面我们就来看看bcos是如何利用Systick定时器实现系统滴答的。...

2022-08-03 22:42:05 605

原创 中断及pendSV

通过任务及任务切换一节读者已经了解了任务切换的详细过程,其实要实现任务切换的功能前面讲的还远远不够。因为,PSP的操作必须在特权模式下,而用户的程序是工作在线程模式下的。所以,用户要想实现任务的切换功能就必须想办法让CPU工作在特权模式下。要想深入了解嵌入是操作系统的实现原理我可能需要了解的更多。下面的内容与平台相关性很强,但是其原理都是大同小异。这里讲的内容时基于ARMCortex-M的处理器讲解的。...

2022-07-28 21:24:23 737

原创 任务及任务切换

这一块的内容有点晦涩,我也是是搞了很久才搞明白的。所以,从自己搞明白到我决定讲明白也经过了漫长的过程。基于以上的原因我踌躇了很久,这部分的内容讲清楚也是一件具有挑战性的事情。到此,任务及任务切换的原理就讲的差不多了,现在我们来总结一下。其实,对于用户来讲可能更加关注的是如何利用操作系统来实现其复杂的业务逻辑,操作系统本身只是为更好的实现多任务的功能服务的。但是,开发者了解操作系统原理本身会对功能的实现提供帮助。什么是任务?任务的本质是什么?单片机是如何从复位运行起来程序的?什么是栈?https。......

2022-07-24 09:33:51 334

原创 链表实现及任务调度

第一次接触链表的时候是大学的数据结构课上,当时设计的链表就是针对某种数据结构的链表。后来学习了C++,由于C++支持泛型编程所以链表可以被设计成可以应用在任意的数据类型中。但是,如何能将C语言的链表应用在任意数据类型的应用场景下是一直困扰我的问题。直到我接触了Linux的内核链表,它的设计思想直接惊艳到了我。下面我们先从使用者的角度去试着理解其内部设计的精妙之处。该链表的实现方案的高明之处就是将链表的操作跟数据域完全分开了,通过一套接口可以适用于所有类型的数据。......

2022-07-24 09:28:29 620

原创 bcos简介及自序

这是一个嵌入式实时操作系统,因大多数时候是周末没事的时候在被窝里开发的,故取名bcos(bedclothesos)。该操作系统支持多任务抢占式优先级调度,定时tasklet等功能。目前的硬件环境是STM32F103ZE,可以移植到大多数的ARMCortex-M的单片机上。开发环境使用的是keil,其他开发环境或编译器移植起来难度也不大。本文分为应用篇和原理篇,应用篇主要介绍bcos各功能模块的使用方法和注意事项,原理篇根据bcos的各功能模块由浅入深的讲解bcos的实现过程和原理。...

2022-07-24 09:22:26 537

原创 内存管理的算法及实现

1.内存管理模块的算法原理及实现bcos的内存管理模块预先会以数组的形式开辟一块内存空间,然后以链表的方式去管理内存的申请和释放。当然在管理的过程中链表的头和保存被占用空间的大小等数据会额外的占用一定的空间。在bcos中内存管理链表节点定义如下:typedef struct{ slist_t list; size_t size;}bcos_mem_t;每次我们申请一块空间时会额外的占用8个字节用来管理这块被分配的内存空间,如果你每次只申请一个字节这似乎看起来不是很合算,所以尽量不要那样做。

2022-05-04 20:46:40 753

原创 内存管理(使用篇)

bcos文档目录bcos简介链表(应用篇)链表的实现(原理篇)1.概述bcos的内存管理模块主要是解决用malloc和free两个库函数进行内存申请和释放的过程中内存碎片化的问题。bcos的内存管理模块用链表的方式管理内存池,会自动的将相连的内存空间组合成一整片的内存空间,尽最大的可能减少内存碎片化的问题。2.内存管理模块的接口在使用内存管理模块前需要对内存管理模块及内存池进行初始化,另外,bcos_mem.h文件中的宏BCOS_HEAP_MEM_SIZE定义了内存池的大小,用户需要根据单片机

2022-04-30 14:55:02 667

原创 链表的实现(原理篇)

1.概述第一次接触链表的时候是大学的数据结构课上,当时设计的链表就是针对某种数据结构的链表。后来学习了C++,由于C++支持泛型编程所以链表可以被设计成可以应用在任意的数据类型中。但是,如何能将C语言的链表应用在任意数据类型的应用场景下是一直困扰我的问题。直到我接触了Linux的内核链表,它的设计思想直接惊艳到了我。下面我们先从使用者的角度去试着理解其内部设计的精妙之处。2.既然链表不能包含所有数据类型那就让所有数据类型都可以包含链表标题既是Linux内核设计链表的核心思想,Linux内核链表是一

2022-04-26 20:46:16 2211

原创 链表(应用篇)

1.概述链表是在程序设计过程中经常使用的数据结构,bcos系统内部的调度和tasklet的实现都是基于链表。所以,对链表的支持是bcos与生俱来的特性。bcos的链表设计参考了Linux内核链表的设计思想,如果用户想使用链表只需要在自己的数据结构中包含链表头,然后便可以开始使用链表来实现自己的数据结构了。2.双向循环链表下面展示了双向循环链表的所有接口并附有简单的解释。每个接口的参数都易于理解,读者很容易理解并使用接口实现利用双向循环链表进行数据的管理。链表头:struct list_head{

2022-04-23 11:29:52 3168

原创 bcos简介

bcos文档目录bcos简介文章目录bcos文档目录前言前言这是一个嵌入式实时操作系统,因大多数时候是周末没事的时候在被窝里开发的,故取名bcos(bed clothes os)。该操作系统支持多任务抢占式优先级调度,定时tasklet等功能。目前的硬件环境是STM32F103ZE,可以移植到大多数的ARM Cortex-M3的单片机上。开发环境使用的是keil,其他开发环境或编译器移植起来难度也不大。本文档分为应用篇和原理篇,应用篇主要介绍bcos各功能模块的使用方法和注意事项,原理篇根据b

2022-04-23 11:24:58 1559

原创 FreeRTOS优先级设施导致进hardfault

工作中将freeRTOS移植到cotexM4F的单片机上#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 7#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5#define configPRIO_BITS 5#define configKERNEL_INTERRUPT_PRIORITY (configLIBRARY_LOWEST_INTERRUPT_PRIORITY <&l

2022-04-15 20:34:43 1437 5

原创 keil使用详解--配置STM32程序运行在RAM

文章目录前言一、什么是程序运行在RAM中?二、使用步骤1.引入库2.读入数据总结前言在前两周的文章中提到,可以在keil中配置程序运行在RAM中,今天就抽时间写写这方面的内容。一、什么是程序运行在RAM中?很简单,就是编译后指令存放的地址在RAM中。那我们需要了解一些STM32地址空间的知识。从图中可以看出,平时我们的程序运行在flash的地址空间二、使用步骤1.引入库代码如下(示例):import numpy as npimport pandas as pdimport mat

2022-03-12 09:31:23 7094 4

原创 keil使用详解--魔法棒后续

文章目录前言一、正文1.Asm2.Linker2.DebugCortex JLink/JTrace Target Driver Setup前言上周对魔法棒的介绍只进行了一半,这周介绍剩下的Asm、Linker、Debug、Utilities。一、正文1.AsmAsm这个页面在实际工程中我个人用到的较少,里面各内容也了解的比较少,这里就不作过多说明,怕有什么错误误导读者。2.Linker这个页面主要影响编译器在链接过程中的配置。第一部分展示了当前存储器的配置,如果这个配置是在ta.

2022-02-20 11:59:46 3601

原创 keil使用详解--魔法棒

介绍keil魔法棒设置界面中各个选项的功能和作用以及配置方法

2022-02-12 13:22:26 16525 2

原创 用python为女朋友写了一个网页截图工具

女朋友在工作中经常要打开某个网页然后全屏截图,有一天回家跟我抱怨说重复的做这件事真的很无聊,要是有一个软件能自动完成就好了。作为程序员的我敏感的意识到自己发光发热的时候道路,其实这件事对于我来说不是件难事,因为我经常用python或者lua在工作中完成一些自动化测试的工作。说干就干,先是百度了一下python如何打开一个网页,然后就很容易实现啦…然后又百度了一下如何全屏截图,拷贝下来试了试也可以用,组合起来就是下面这样import webbrowserimport pandas as pdimpo

2021-06-27 14:00:05 217 1

原创 qemu STM32 VSCode调试环境配置

系列文章目录文章目录系列文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考一、pandas是什么?示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。二、使用步骤1.引入库代码如下(示例):import numpy

2021-03-14 21:37:51 2292 11

原创 qemu Demo makefile分析

系列文章目录[qemu的STM32虚拟化环境](https://blog.csdn.net/BLUCEJIE/article/details/113482065)文章目录系列文章目录前言一、分析一下demo程序的makefile二、使用步骤1.引入库2.读入数据总结前言上周成功的搭建了qemu的STM32的虚拟化环境,今天我们就学习一下原作者给出的DEMO程序,从中分析一下虚拟化环境的使用方法。为我们下一步的学习打一个基础。一、分析一下demo程序的makefile习惯于在keil M

2021-03-09 20:38:20 476

原创 qemu的STM32虚拟化环境

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、qemu是什么二、使用步骤1.引入库2.读入数据总结前言年关将近,2021年新年再一次受新冠影响无法好好的回家过了。由于工作需要了解一点ARM汇编的知识,于是我决定学习一下。上来第一件事就是希望有一个学习的环境,买一个开发板感觉不值得,于是希望可以用qemu构建一个虚拟化的环境来助力一下自己的学习热情。一、qemu是什么qeme是一个虚拟机,自持许多架构的cpu,反正就是一个开源又强大的东西。具体的内容可以参考官

2021-01-31 18:30:09 10037 7

stm32 bootloader使用文档

stm32的bootloader(自举程序)串口下载命令使用文档,描述了通过串口与stm32的自举程序握手、对flsash进行读、写、擦等功能。根据该文档可实现自己的串口下载软件逻辑。

2023-09-23

STM32中文参考手册

STM32中文参考手册

2022-12-31

SerialPort.rar

博客https://blog.csdn.net/BLUCEJIE/article/details/103753635的源码包

2019-12-29

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除