• 一个困扰我很久的问题

    大约在一年半前,我写了一篇文章介绍如何统计FreeRTOS系统中任务的实时CPU占用率的方法,其中最关键的是使用DWT计数器。我一直认为这个计数器在任意条件下都是能够正确运行的,直到我把它运用到Cortex-M7内核中。 正常情况下Cortex-M7...
  • 统计FreeRTOS中各个线程的处理器利用率

    大约是在一年前,我在工作中遇到了需要分析嵌入式系统性能的需求,需要查看系统在关键时间点上,部分任务是否存在执行时间过长导致系统实时性能降低的情况。我在基于FreeRTOS的系统中设计了一段非侵入式的代码,能够获取到各个线程实时的处理器利用率,进而分...
  • 更优雅的使用Protothreads协程框架

    PT协程框架PT(Protothreads)是一个轻量级的多任务框架,区别于一般基于栈的RTOS,它实现多任务的基本原理是通过语句间的任意跳转来实现任务切换,所以实现多任务的开销比较小。 我们看一段示例代码来了解其用法。 12345678910111...
  • PT协程的一个小扩展

    在之前的文章中介绍了使用链表来更加优雅的使用PT协程。我最近发现了当初实现的一个错误,现在已经修复了。 这里不是为了讨论之前的实现,而是介绍一个更有意思的东西。我在之前的实现基础上,实现了一个更加优雅的函数来利用协程,这应该是一种异步编程的技巧,或者...
  • 实现独有的硬件通信总线

    背景前段时间开发了一个嵌入式软件,其中有一个功能是使用PWM驱动一个无源的蜂鸣器,根据以往的经验来看,这是一个非常简单的功能,不过在实际操作时遇到了一个很多人往往都忽略的问题。我们硬件选择的单片机没有硬件PWM功能,只有普通的定时器,这就意味着我们只...
  • 初学射频信号

    从事嵌入式软件开发4年有余,我自认为还是有相当多的知识和技能存在欠缺,所以近年来一直保持良好的学习态度,持续充实自身的技能。从之前的文章内容能够看出,我主要围绕嵌入式软件开发的多个方面记录自己的学习心得。但实际上不仅限于此,在过去的一年中有很多机会...
  • 单片机总线选择焦虑

    当你有多个选择,但是每个选择都不完美时,就会出现选择焦虑! 最近在优化单片机上USB协议栈内的代码,我发现了一个我之前没有被注意到的地方,那就是写入到USB端点上的数据是由DMA自动完成的,涉及到DMA的内存区域都需要特别对待,而我之前就是将它...
  • ARM嵌入式开发中的栈回溯机制

    两种ABI规范根据编译器的实现不同,存在两种ABI机制,分别为APCS(ARM Procedure Call Standard)和AAPCS(ARM Archtecture Procedure Call Standard)。两种机制存在明显的区别,且...
  • Macro returning the number of arguments it is given in C?

    一个简单的实现能否使用一个简单的宏在C语言中计算不定参数的数量,例如这样: 123foo(1) -> 1foo(cat, dog) -> 2foo(red, green, blue) -> 3 一个比较简单的实现是这样的: 1#de...
  • FreeRTOS中协程支持低功耗吗

    FreeRTOS协程FreeRTOS除了支持多线程外,还支持另外一种多任务机制-协程(coroutine)。它和线程不一样,每个协程不需要独立的运行空间,它依靠编程语法技巧在逻辑上实现了多任务的机制。它避免的一般RTOS带来的栈切换开销,仅仅依靠极小...
/4