FEERTOS的TICKLESS模式下最大低功耗的时间只能是349tick的原因分析
@[toc] FEERTOS的TICKLESS模式下最大低功耗的时间只能是349tick的原因分析原因 开启TICKLESS模式后,在PreSleepProcessing和PostSleepProcessing中打印ulExpectedIdleTime变量,即空闲时间.输出如下 代码如下 123456789void PreSleepProcessing(uint32_t *ulExpectedIdleTime){ log_i("ulExpectedIdleTime %lu", *ulExpectedIdleTime);}void PostSleepProcessing(uint32_t *ulExpectedIdleTime){} 分析 为什么是349tick进入一次空闲线程? 分析FREERTOS源码,在portTASK_FUNCTION函数中调用接口,写入空闲时间值 在赋值后打印变量 12345678910111213141516171819202122if( xExpectedIdleTime &...
ARM原子操作
@[toc] 原子操作1.概述原子操作很好用,在两三个小线程要同步变量时,不占用中断,也不过度占用资源。如果使用Mutex等并发原语进行这些优化,虽然可以解决问题,但是这些并发原语的实现逻辑比较复杂,对性能还是有一定的影响的。atomic包提供的方法会提供内存屏障的功能,atomic不仅仅可以保证赋值的数据完整性,还能保证数据的可见性,一旦一个核更新了该地址的值,其它处理器总是能读取到它的最新值。原子操作常用的三个操作有load,store,exchange。load方法会取出addr地址中的值;store方法会把一个值存入到指定的addr地址中;如果不需要比较旧值,只是比较粗暴地替换的话,就可以使用exchange方法,它替换后还可以返回旧值。 2.使用● 最简单的使用途径替换NODE_CRITICAL_SECTION_BEGIN与NODE_CRITICAL_SECTION_END之间的变量操作代码;全局变量,且在不同线程间同步才有意义 ● 理解与使用查看测试文件既可 ● 测试代码在STM32WLE上验证通过;如下验证代码通过可证明原子操作的效果,不会使得变量在不同线程...
U-BOOT CLANGD使用 + 避坑注意事项
[toc] 步骤1 参考如下教程操作;安装clangd + bear https://blog.csdn.net/oushaojun2/article/details/129877412 步骤2 使用方式,看版本 bear make 或者 bear – make 注意事项 出现 Unknown argument: ‘-mword-relocations’ 根目录新建.clangd文件,写入Remove的选项 1234CompileFlags: # Tweak the parse settings Add: [-xc++, -Wall] # treat all files as C++, enable more warnings Remove: -W* # strip all other warning-related flags Compiler: clang++ # Change argv[0] of compi...
objdump反汇编失败的解决办法
[toc] -m 显示添加目标架构 通常,objdump会自己识别目标架构;如果没有识别出来可以自行添加架构 file命令查看.O文件的架构信息 查看后指定目标架构既可 objdump -i 输出所支持的架构 用于选择-m 的参数要输入什么 交叉编译的使用 由于主机的objdump架构与编译目标的架构不同; 需要使用特定的objdump; 例如armv7m要使用arm-none-eabi-objdump
ubantu st-link 调试
@[toc] Linux如何安装/卸载.deb文件 https://blog.csdn.net/vuipp/article/details/126031945 安装.deb 只要输入“sudo dpkg -i 文件名”就可以了 Ubuntu中gcc-arm-none-eabi的安装 https://blog.csdn.net/qq_20016593/article/details/125343260 手动安装(推荐)(1)官网下载:https://developer.arm.com/downloads/-/gnu-rm 1234567pushd .tar -jxf gcc-arm-none-eabi-6-2017-q2-update-linux.tar.bz2sudo mv gcc-arm-none-eabi-6-2017-q2-update /optexportline="export PATH=/opt/gcc-arm-none-eabi-6-2017-q2-update/bin:\$PATH"if grep -Fxq "$...
uboot 调试
@[toc] 成功debug https://blog.csdn.net/qq_39665253/article/details/145641929 u-boot 配置 https://docs.u-boot.org/en/latest/develop/gdb.html 123CONFIG_CC_OPTIMIZE_FOR_DEBUG=yCONFIG_LTO=n CONFIG_LOG_MAX_LEVEL=9 重新编译.得到u-boot的elf文件(不带后缀就是),可以使用file u-boot确认 ST-LINK debug失败12345678910111213141516171819202122232425262728293031{ "version": "0.2.0", "configurations": [ { "name": "Stlink-Debug", "cwd...
向u-boot提交补丁的流程
@[toc] 首先需要订阅一下,地址在此https://lists.denx.de/listinfo/u-boot,使邮箱地址对应有一个成员名称,才能向uboot社区发送补丁,否则会收到Post by non-member to a members-only list2. 注册完毕即可发送补丁,发送完之后即可在https://patchwork.ozlabs.org/project/uboot/list/看到了(首次贡献的话发送完补丁后需要等待至少12个小时才会将发送的补丁显示在patchwork上)。 观看如下文档的步骤使用patman工具 https://docs.u-boot.org/en/latest/develop/sending_patches.html pip install patch-manager git config sendemail.aliasesfile doc/git-mailrc 使用git config --list | grep sendemail检查是否生效 patman send -n试运行,并不会真的发出去...
UBOOT 早期串口调试功能CONFIG_DEBUG_UART适配教程
@[toc] https://github.com/wdfk-prog/u-boot/tree/art-pi-debug 前提条件 该思路使用与STM32系列,其他芯片系列仅做参考 Kconfi配置 开启如下配置 其中CONFIG_DEBUG_UART_BASE是串口的寄存器地址.地址看手册就行,找不到也基本不用看了. CONFIG_DEBUG_UART_CLOCK是串口所在时钟的频率. 需要注意该频率是没有初始化时钟源,默认采用HSI,分频与倍频都是1时的时钟频率 可以使用CUBEMX辅助计算 1234CONFIG_DEBUG_UART_BOARD_INIT=yCONFIG_DEBUG_UART=yCONFIG_DEBUG_UART_BASE=0x40004c00CONFIG_DEBUG_UART_CLOCK=64000000 编写makefile 参考board/st/stm32mp1/debug_uart.c和makefile的实现编写 找到所在的板子的路径 我这里使用的是board/st/stm32h750-art-pi 添加makefile,把de...
U-BOOT 配置按钮功能及使用教程
@[toc] https://github.com/wdfk-prog/u-boot/tree/art-pi-debug Kconfig配置 添加如下配置,使用按键驱动与按键绑定命令功能与按键命令识别 12345CONFIG_BUTTON_CMD=yCONFIG_CMD_BUTTON=yCONFIG_BUTTON=yCONFIG_BUTTON_GPIO=yCONFIG_CMD_BOOTMENU=y 添加env环境变量 路径参考:board/st/stm32h750-art-pi/stm32h750-art-pi.env 这里的button_cmd_0=后面是需要支持的cmd命令,必须要可以使用的 这里使用bootmenu体现 1234567891011button_cmd_0_name=Userbutton_cmd_0=bootmenubootmenu_0=mount internal storage=usb start && ums 0 mmc 0; bootmenubootmenu_1=fastboot=echo S...
[UBOOT][STM32]编写LED支持教程
@[toc] 前提1.目的:uboot启动时没有状态提醒,无法知道当前板子运行到了什么阶段2.所以需要一个LED来指示当前的U-BOOT状态 编写 参考:board/st/stm32f429-discovery/led.c 在自己的板级目录下makefile修改. 加入led.c的编译 12//board/st/stm32h750-art-pi/Makefileobj-y += led.o 添加led.c文件并编写 board/st/stm32h750-art-pi/led.c GPIO编号转换成引脚的宏已经写好了,对应修改成自己的引脚既可 gpio_direction_output(RED_LED, 1);这个就是配置后输出对应的电平,根据需要修改高低电平既可 1234567891011121314151617181920212223242526272829303132333435#include "acpi/acpi_device.h"#include <status_led.h...







