
bcos
文章平均质量分 77
这是一个我开发嵌入式实时操作系统的个人笔记,详细记录了开发一个嵌入式实时操作系统的过程及原理,整个专栏包括原理篇:讲解操作系统实现过程及原理。应用篇:使用bcos的方法。调试技术:总结了实际嵌入式开发过程中常见的问题及调试方法。
南波儿万
一个程序猿
展开
-
vscode+cmake的STM32单片机调试开发环境
说实话我不是非常喜欢使用Keil MDK进行嵌入式开发。但是,对于STM32等单片机来说MDK的优秀的在线调试功能总是让人喜欢。最让我不喜欢的是MDK的编辑器以及配色。这让我不停的尝试使用Visual Studio Code进行编辑代码然后使用MDK进行编译和调试,就这样我在两个IDE之间来回切换。于是,我进一步厌烦了这种开发方式。于是我决定用cmake来管理和编译工程,在Visual Studio Code来编辑代码。这样我甚至可以在工程中嵌入Python脚本来提高工作效率。原创 2023-09-23 14:44:59 · 3469 阅读 · 0 评论 -
关于系统调用app接口进hardfault问题的调试(调试技术)
我们都清楚,这个值本来应该是led_task的任务控制块的地址值,我们再观察一下当前R9寄存器中的值,明显是一个异常的值。由于当前执行再系统的另一个任务中,APP的全局变量的基地址没有保存在R9寄存器中所以出现了寻址错误的问题。在运行APP时将R9寄存器保存下来,在执行退出时先保存当前任务R9寄存器的值然后恢复APP的R9寄存器值,执行退出后恢复当前任务的R9的值。APP的实现很简单,就是创建了一个任务实现了一个LED等的闪烁,APP退出接口就是将任务进行了销毁,其中用到了一个全局变量。原创 2022-10-17 21:19:23 · 381 阅读 · 0 评论 -
keil导入外部程序功能的妙用(调试技术)
作为一个使用keil开发单片机的嵌入式开发者想必大多数都使用过keil在编译后直接输出bin文件的经历。keil IDE工具在魔法棒(Option for taget ‘xx’)配置功能的User页面运行用户配置执行六条命令。配置界面如下:在编译C/C++文件前执行;在点击编译或重新编译按钮后,在真正开始编译程序前执行命令;在点击编译或重新编译按钮后,将程序编译完成后执行;原创 2022-10-17 21:15:56 · 1478 阅读 · 0 评论 -
死锁问题的调试(调试技术)
最近工作中遇到一个问题,我决定总结一下死锁的问题。在多线程的系统中经常需要利用锁来实现临界区的保护,但在临界区保护过程中经常出现加锁和解锁没有成对出现的问题。最终,系统进入死锁状态。在bcos中目前还没有实现锁的机制,即便如此任务间的调度最终也会引发临界区的问题。在bcos中解决临界区问题的方法是屏蔽中断,因为系统调度主要依靠中断来实现任务的抢占。如果在进入临界区时屏蔽系统所有中断,在退出临界区时解除中断的屏蔽可以实现类似于锁的功能。原创 2022-10-17 21:12:03 · 440 阅读 · 0 评论 -
编译器优化导致的问题(调试技术)
在讲编译器优化导致程序问题前先要讲讲什么是编译器优化。不同的C语言编译器都会对程序进行一定程度的优化,每种编译器都会划分几种编译优化等级。不同的优化等级对程序的优化程度不同,有对代码空间的优化,有对执行时间的优化。编译器针对不同问题的优化都是基于某种算法的,但是最终的原则是不能改变用户程序的执行逻辑。在大多数情况下这种优化会提高程序的执行效率及优化代码空间,但是有时编译器也会错误的领会程序员的意图,将一些代码优化后造成不可预测的问题。原创 2022-10-17 21:00:42 · 2606 阅读 · 0 评论 -
Hardfault调试方法(调试技术)
在单片机调试过程中最让开发者感到头疼的就是遇上Hardfault错误问题了,如何快速的触发问题的原因是解决问题的关键。可是类问题对于比较初级的开发者来说往往没有掌握有效的方法找到是那行代码触发了Hardfault。网上的博客有一些方法解决这类问题,当时讲的又不是很系统,这篇的目的就是系统的讲解一下Hardfault错误的具体定位方法。这篇文章的方法是建立在可以用Keil + Jlink实现在线调试的环境下,请读者注意这个前提条件,其他条件下的定位方法我会在以后的章节中给出。原创 2022-10-16 11:23:45 · 1092 阅读 · 0 评论 -
keil调试工具(调试技术)
目前嵌入式单片机的开发最常用的调试工具就是keil,该IDE软件虽然编辑的功能不受开发者欢迎但是我认为其调试的功能却是非常的优秀。真个我们调试技术这一部分大多数是讲解keil调试工具的使用方法,当然还原其他的一些工具,比如说jlink、逻辑分析仪等。我目前了解到的没有一本书或文章系统的讲解单片机的调试技术的,为了给更多开发者能系统的了解到调试的方法和手段,我这里就自不量力总结一些这方面的内容。原创 2022-10-16 10:59:28 · 5601 阅读 · 0 评论 -
独立app开发和运行(使用篇)
bcos支持动态加载APP任务到内存中执行,用户应用程序只要调用bcos提供的系统调用就可以实现自己的APP功能。当然,APP的开发需要遵循一些bcos自己的规则。原创 2022-10-16 10:49:36 · 2565 阅读 · 1 评论 -
tasklet的使用(使用篇)
tasklet的实现主要是为了满足嵌入式系统开发过程中经常会遇到定时周期任务、延时任务等需求。在bcos系统中,tasklet在空闲任务中执行,空闲任务在系统中的优先级最低。所以,当系统中没有其他任务执行时,空闲任务会检查tasklet队列中是否有超时的任务需要执行。用户在使用tasklet时一定要注意这一点。tasklet的回调函数的执行与我们预期执行的时间的误差取决于系统中其他线程任务的繁忙程度,当然由于空闲任务的优先级最低,所以在tasklet回调函数执行的过程中可能会被其他高优先级的就绪任务抢占。原创 2022-10-16 10:46:35 · 846 阅读 · 0 评论 -
延时和任务挂起(使用篇)
在任务中延时和任务挂起是嵌入式操作系统中的常规需求,bcos提供了任务延时和挂起的接口。用户调用任务延时接口和任务挂起任务挂起接口后调用这两个接口的任务会被系统调度到任务等待队列中,直到任务延时超时或用户调研任务恢复函数后才会重新被添加到就绪队列中调度执行。在正常的bcos的使用过程中每一个任务至少要有1ms的延时调用,否则该任务会一直占用cpu的执行权其他任务无法被调度执行。原创 2022-10-16 10:23:07 · 335 阅读 · 0 评论 -
任务使用(使用篇)
当然,两个任务的优先级尽量不要相同,如果用户创建了两个优先级相同的任务也没关系系统仍然可以正常运行,只是这两个优先级相同的任务如果同时处于就绪状态时其执行顺序是不确定的。另外,对于使用了内存管理模块的用户,bcos系统提供了一种可以动态分配任务控制块和栈空间的任务创建接口,它就是bcos_task_malloc。对于使用bcos_task_malloc创建的任务,任务销毁后任务控制块和栈空间会被释放到内存池中供系统再次使用,可以提高系统的性能。静态创建tcb和栈空间的方式创建任务。原创 2022-10-16 10:21:52 · 276 阅读 · 0 评论 -
内存管理(使用篇)
bcos的内存管理模块主要是解决用malloc和free两个库函数进行内存申请和释放的过程中内存碎片化的问题。bcos的内存管理模块用链表的方式管理内存池,会自动的将相连的内存空间组合成一整片的内存空间,尽最大的可能减少内存碎片化的问题。原创 2022-10-16 10:19:57 · 1082 阅读 · 0 评论 -
链表(使用篇)
链表是在程序设计过程中经常使用的数据结构,bcos系统内部的调度和tasklet的实现都是基于链表。所以,对链表的支持是bcos与生俱来的特性。bcos的链表设计参考了Linux内核链表的设计思想,如果用户想使用链表只需要在自己的数据结构中包含链表头,然后便可以开始使用链表来实现自己的数据结构了。下面展示了双向循环链表的所有接口并附有简单的解释。每个接口的参数都易于理解,读者很容易理解并使用接口实现利用双向循环链表进行数据的管理。链表头:初始化链表:链表节点的添加链表节点的删除链表遍历获取链表的第原创 2022-10-16 10:17:53 · 158 阅读 · 0 评论 -
动态加载APP运行(原理篇)
bcos开发到现在已经可以实现操作系统的基本功能:任务管理、任务调度、简单的内存管理。但是,相比于Windows、Linux似乎缺少了一个动态运行程序的功能。再单片机上能不能实现动态加载和运行程序的功能呢?我思考了一下,想必是可以实现的。想必有的读者使用过MP4这种东西吧?这种东西的成本并不高我猜测他的主控应该使用的是类似于STM32这样的单片机,但是它为什么可以安装多个APP并动态运行呢?肯定是有一些我没有掌握的知识限制了我实现此项功能。功夫不负有心人,我找到了一点相关的资料,简单的实现了相应的功能。原创 2022-10-16 10:12:28 · 1585 阅读 · 0 评论 -
终端的实现(原理篇)
其实,终端的实现应该放到应用篇的一个示例里面。但是,我实现终端的最初目的是为动态加载APP功能服务的。为了实现动态加载APP的功能我移植了文件系统、实现了终端命令和添加了系统调用的功能。所以,我将终端的实现归入到内核模块中,如果有的应用不需要该功能可以将其裁剪掉。终端是属于人机交互的部分,主要功能是实现用户操作计算机。bcos为了实现简单的人机交互需求也实现了简单的终端功能,用户可以实现自己的终端命令并添加到终端中,这样更方便测试。原创 2022-10-16 10:01:02 · 518 阅读 · 0 评论 -
文件及文件系统的移植(原理篇)
为了实现动态加载用户程序到RAM中执行的功能,移植一个文件系统是实现路上不可逾越的一道坎。恰恰我用于测试的开发板上有一片空间有8M之多的Flash(W25Q64),当然板子上还有一个SD卡槽。为了节约成本,我决定再现有的Flash上移植Fatfs用来作为系统的文件系统。原创 2022-10-11 20:08:31 · 1634 阅读 · 0 评论 -
系统调用(原理篇)
bcos其实没有内核层和应用层之间明显的权限限制。但是,在APP与系统代码分开编译的时候每次系统代码编译后APP代码都需要重新编译,这还不是最大的问题。最大的问题是有的系统接口在系统中没有被调用过,keil导出的符号表中就没有对应的接口。基于上面的问题,bcos实现了系统调用的功能以便应用程序更高的使用系统功能。...原创 2022-08-27 14:47:46 · 433 阅读 · 3 评论 -
模块及模块管理(原理篇)
bcos实现了类似于Linux驱动模块的功能,从而实现了驱动模块的解耦,进一步提高了bcos的可移植性。原创 2022-08-27 14:07:49 · 340 阅读 · 0 评论 -
tasklet的实现(原理篇)
在前面的使用篇已经清晰的描述了tasklet的实现目的与使用方法。本节将重点描述tasklet的实现原理和方法。原创 2022-08-16 21:17:32 · 865 阅读 · 0 评论 -
系统滴答及Systick定时器
操作系统需要有一个系统的滴答来提供任务管理的时间依据,bcos中的任务延时及tasklet的定时都是依据系统滴答。系统滴答需要一个定时器来提供时间基准,几乎所有的CPU都会提供一个滴答定时器(SYSTICK)来提供给操作系统使用。我们现在使用的STM32也不例外,下面我们就来看看bcos是如何利用Systick定时器实现系统滴答的。...原创 2022-08-03 22:42:05 · 722 阅读 · 0 评论 -
中断及pendSV
通过任务及任务切换一节读者已经了解了任务切换的详细过程,其实要实现任务切换的功能前面讲的还远远不够。因为,PSP的操作必须在特权模式下,而用户的程序是工作在线程模式下的。所以,用户要想实现任务的切换功能就必须想办法让CPU工作在特权模式下。要想深入了解嵌入是操作系统的实现原理我可能需要了解的更多。下面的内容与平台相关性很强,但是其原理都是大同小异。这里讲的内容时基于ARMCortex-M的处理器讲解的。...原创 2022-07-28 21:24:23 · 951 阅读 · 0 评论 -
任务及任务切换
这一块的内容有点晦涩,我也是是搞了很久才搞明白的。所以,从自己搞明白到我决定讲明白也经过了漫长的过程。基于以上的原因我踌躇了很久,这部分的内容讲清楚也是一件具有挑战性的事情。到此,任务及任务切换的原理就讲的差不多了,现在我们来总结一下。其实,对于用户来讲可能更加关注的是如何利用操作系统来实现其复杂的业务逻辑,操作系统本身只是为更好的实现多任务的功能服务的。但是,开发者了解操作系统原理本身会对功能的实现提供帮助。什么是任务?任务的本质是什么?单片机是如何从复位运行起来程序的?什么是栈?https。......原创 2022-07-24 09:33:51 · 382 阅读 · 0 评论 -
链表实现及任务调度
第一次接触链表的时候是大学的数据结构课上,当时设计的链表就是针对某种数据结构的链表。后来学习了C++,由于C++支持泛型编程所以链表可以被设计成可以应用在任意的数据类型中。但是,如何能将C语言的链表应用在任意数据类型的应用场景下是一直困扰我的问题。直到我接触了Linux的内核链表,它的设计思想直接惊艳到了我。下面我们先从使用者的角度去试着理解其内部设计的精妙之处。该链表的实现方案的高明之处就是将链表的操作跟数据域完全分开了,通过一套接口可以适用于所有类型的数据。......原创 2022-07-24 09:28:29 · 774 阅读 · 0 评论 -
bcos简介及自序
这是一个嵌入式实时操作系统,因大多数时候是周末没事的时候在被窝里开发的,故取名bcos(bedclothesos)。该操作系统支持多任务抢占式优先级调度,定时tasklet等功能。目前的硬件环境是STM32F103ZE,可以移植到大多数的ARMCortex-M的单片机上。开发环境使用的是keil,其他开发环境或编译器移植起来难度也不大。本文分为应用篇和原理篇,应用篇主要介绍bcos各功能模块的使用方法和注意事项,原理篇根据bcos的各功能模块由浅入深的讲解bcos的实现过程和原理。...原创 2022-07-24 09:22:26 · 648 阅读 · 0 评论