-
初学射频信号
从事嵌入式软件开发4年有余,我自认为还是有相当多的知识和技能存在欠缺,所以近年来一直保持良好的学习态度,持续充实自身的技能。从之前的文章内容能够看出,我主要围绕嵌入式软件开发的多个方面记录自己的学习心得。但实际上不仅限于此,在过去的一年中有很多机会... -
一个困扰我很久的问题
大约在一年半前,我写了一篇文章介绍如何统计FreeRTOS系统中任务的实时CPU占用率的方法,其中最关键的是使用DWT计数器。我一直认为这个计数器在任意条件下都是能够正确运行的,直到我把它运用到Cortex-M7内核中。 正常情况下Cortex-M7... -
更优雅的使用Protothreads协程框架
PT协程框架PT(Protothreads)是一个轻量级的多任务框架,区别于一般基于栈的RTOS,它实现多任务的基本原理是通过语句间的任意跳转来实现任务切换,所以实现多任务的开销比较小。 我们看一段示例代码来了解其用法。 12345678910111... -
单片机总线选择焦虑
当你有多个选择,但是每个选择都不完美时,就会出现选择焦虑! 最近在优化单片机上USB协议栈内的代码,我发现了一个我之前没有被注意到的地方,那就是写入到USB端点上的数据是由DMA自动完成的,涉及到DMA的内存区域都需要特别对待,而我之前就是将它... -
Macro returning the number of arguments it is given in C?
一个简单的实现能否使用一个简单的宏在C语言中计算不定参数的数量,例如这样: 123foo(1) -> 1foo(cat, dog) -> 2foo(red, green, blue) -> 3 一个比较简单的实现是这样的: 1#de... -
实现独有的硬件通信总线
背景前段时间开发了一个嵌入式软件,其中有一个功能是使用PWM驱动一个无源的蜂鸣器,根据以往的经验来看,这是一个非常简单的功能,不过在实际操作时遇到了一个很多人往往都忽略的问题。我们硬件选择的单片机没有硬件PWM功能,只有普通的定时器,这就意味着我们只... -
我们需要谨慎操作Cache
成都有疫情有半个月了,在家办公的日子总是很枯燥的,很多的工作无法正常开展。今天有时间,我尝试对Ymodem的传输效率进行优化并完善其中的一些细节实现,本来一个简单的优化工作却牵出一个严重的问题,并最终折腾了一天才解决。这是一个并不典型的内存溢出问题... -
FreeRTOS中协程支持低功耗吗
FreeRTOS协程FreeRTOS除了支持多线程外,还支持另外一种多任务机制-协程(coroutine)。它和线程不一样,每个协程不需要独立的运行空间,它依靠编程语法技巧在逻辑上实现了多任务的机制。它避免的一般RTOS带来的栈切换开销,仅仅依靠极小... -
FreeRTOS上实现swap机制
为什么需要引入SWAP机制在小容量SRAM的单片机上使用RTOS是一种很尴尬的事情,因为每个任务都需要分配独立的线程栈,栈空间少则512字节,复杂任务的栈空间则达到了几千字节的大小,这对于仅有8k字节SRAM的单片机来说显得压力太大了,两三个任务就导... -
内存陷阱,一种内存调试方法
需求场景在一个多任务系统中,当一个全局可访问的数据出现了异常,如何排查问题呢?由于在多任务环境中,各个任务并行运行,一般的单步跟踪调试很难定位问题。逐个屏蔽代码又可能会导致问题无法复现。使用内存断点是比较好的方法,但是大多数集成开发环境对该功能的支持...