stm32
文章平均质量分 71
uav360
这个作者很懒,什么都没留下…
展开
-
11.Ubuntu下开发STM32--使用malloc
Ubuntu下开发STM32已经接近尾声。如果不出意外的话,这篇将会是最后一篇了。突然有点心痛,毕竟,在也没有机会这么明目张胆的传图片,刷金币了。Newlib申请内存的机制这次介绍的是Newlib下的malloc。不同与keil mdk下的malloc。两者的实现机制是不同的。keil mdk是在汇编文件中改一个数值,用来设置堆的大小。今后的所有malloc申请的内存都在这个堆中。堆的大小是在编译的时候确定的,预先放入bss段中。而Newlib使用的是sbrk的机制。只要sbrk的申请的地址还没到当前s转载 2021-06-19 18:46:19 · 578 阅读 · 0 评论 -
12.Ubuntu下开发STM32--HardFault,div0
看了creep发的一篇帖子https://www.stmcu.org.cn/module/forum/forum.php?mod=viewthread&tid=602444&highlight=hardfault,讲解的是如何找出程序中的HardFault。creep的帖子中提到了一个老外的链接http://blog.feabhas.com/2013/02/developing-a-generic-hard-fault-handler-for-arm-cortex-m3cortex-m4/,转载 2021-06-19 18:46:47 · 238 阅读 · 0 评论 -
10.Ubuntu下开发STM32--再谈exit
在笔记6—使用串口Part2(https://www.stmcu.org.cn/module/forum/thread-603909-1-1.html)中,我们简单的介绍了一下exit。在windows或者linux操作系统中,main的返回值是有意义的,类型为int。这个返回值实际上是返回给操作系统的。0表示程序正常终止,其他非零表示程序异常终止。在使用ST固件库提供的启动文件和syscalls.c文件之后,如果程序中主动调用exit,能跳转到_exit系统调用中。如果main中使用return,并不能转载 2021-04-01 14:51:31 · 211 阅读 · 0 评论 -
09.Ubuntu下开发STM32--浮点运算
cortex-m4内核具有浮点运算单元。如果不使用的话,还是有点浪费的。软浮点gcc在默认的情况下使用软浮点运算。相关浮点运算测试的代码在softfloat.zip中。为了反汇编观察代码,这里特意去掉了Os优化。使用Newlib-nano库。使用make sram,sudo make burns下载到SRAM中运行。从输出的时间间隔上来看,软件浮点也是挺快的。这里我们反编译一下main.o的代码看一下。float add(float a,float b,float c ){ return转载 2021-04-01 14:50:35 · 424 阅读 · 0 评论 -
08.Ubuntu下开发STM32--使用printf
开始尝试使用标准库的一些东西的时候,也就意味着我们的linux环境下开发STM32的教程已经接近尾声了。标准库的使用我们这里仅仅介绍使用printf和malloc。syscalls想使用标准库,我们需要自己完成一些系统调用。像keil mdk下使用printf一样,至少要完成fputc和fgetc。然而newlibc下使用printf却不这么简单。并不是一个__io_getchar, __io_putchar能够完成的。幸好,ST的固件库中有我们使用的大部分源码。都在TrueStudio的模板下。大家可转载 2021-04-01 14:49:38 · 433 阅读 · 0 评论 -
07.Ubuntu下开发STM32--使用串口Part2
在上一篇Part1的时候,我们说了有个bug,也就是中断向量表的问题。其实这个问题在第4节—在SRAM中运行程序的时候就存在。只不过我们的程序中没有使用中断,也就导致这个bug没有发现。如果我们在上一节的代码中尝试将程序下载到SRAM中运行的时候,也就是make sram,sudo make burns,这样串口只能发送。不能接收。究其原因还是中断惹得祸。我们使用st-flash工具直接将代码下载到SRAM中,st-flash在下载完之后,会尝试更改pc到Reset_Handler。并运行第一行代码。但是转载 2021-04-01 14:48:43 · 228 阅读 · 0 评论 -
06.Ubuntu下开发STM32--使用串口Part1
可能觉得使用串口很简单,无非就是初始化GPIO,初始化串口。接着发送—检测是否成功。表面上看来是很简单的问题。然而,我要说的并不是这些。我要说的是volatile和中断向量表的问题。在其中配合一点gdb调试。使用ringbuffer这里的串口使用非缓冲发送,ringbuffer中断缓冲接收的方式。先来看看ringbuffer。ringbuffer是一个特殊的队列,FIFO。struct ringbuffer{ uint8_t *bf; int len; int cou转载 2021-04-01 14:47:24 · 510 阅读 · 0 评论 -
05.Ubuntu下开发STM32--SRAM中运行程序
st-flash能够将代码下载至STM32的任何位置。甚至是SRAM。在下载完毕之后,不用我们手动设置,他自动的设置pc至你下载代码的位置,并从pc处开始运行。反汇编先来反汇编我们点亮ledhttps://www.stmcu.org.cn/module/forum/thread-603787-1-1.html的代码。使用arm-none-eabi-objdump -d blink.elf生成反汇编代码,如下图所示:等等,为什么第一条指令的地址是0x0800_0188?我们的代码不是应该从0x0800转载 2021-04-01 14:46:17 · 347 阅读 · 0 评论 -
04.Ubuntu下开发STM32--优化程序大小
在上一篇帖子(https://www.stmcu.org.cn/module/forum/thread-603787-1-1.html),我们使用gcc和Makefile成功的点亮了一盏led灯。却发现程序有点大,占用了6K多的代码空间。相比keil mdk下的代码量,这个确实大的多。这并不是我们使用的gcc的原因,也不是gcc链接newlibc库的原因。而是我们没有选择任何优化的参数。(下图是未经任何优化的代码大小)-Os优化说到代码的优化,在单片机中,由于flash空间过小,我们并不会过多的考虑优转载 2021-04-01 14:44:58 · 515 阅读 · 0 评论 -
03.Ubuntu下开发STM32--灯,等灯等灯
在Ubuntu下开发STM32并不简单。这里说的不简单是上手困难。不太适合新手。对一个刚开始学习STM32的人来说,如果一开始就使用Ubuntu开发,我觉得并不是一个好的注意。对于初学者来说,如果你的代码出现问题,你既要考虑是不是固件库的问题,又要考虑是不是Makefile的问题。还要考虑newlib(arm-none-eabi-gcc使用的库)系统调用的问题。这么多的问题加在一块,足够你想放弃学习了。因此,对于初学者来说,就不要瞎折腾了。还是老老实实的使用keil mdk,iar等一些IDE,从0开始学转载 2021-04-01 14:43:43 · 359 阅读 · 0 评论 -
02.Ubuntu下开发STM32--我叫Makefile
回忆我们在windows环境下使用IDE进行开发,只要一股脑的将多有的源文件添加到工程中,点一个按钮,IDE就会为我们生成可执行文件。但是期间发生了什么?我们无从得知。IDE让我们编程简单的同时,也让我们变得更加傻瓜。在linux下编程,最常用的莫过于gcc了。比如我们编译main.c生成main.exe(在linux下,叫做main.out)或许更好些。只需要在控制台下敲下:$ gcc -Wall main.c -o main.out-Wall是允许提示所有的警告。更多参数解释请参考http://转载 2021-04-01 14:42:30 · 373 阅读 · 1 评论 -
01.Ubuntu下开发STM32--软件搭建
记事本用习惯了,论坛写帖子的时候动不动Ctrl+S一下。。。在Ubuntu下开发STM32,两个常用软件是必须的。我们的交叉编译器,arm-none-eabi-xxx。st-link的驱动。这里的st-link并不像我们windows下面用的那样,一路点Next就好了。这里我们需要从github上面下载源码,自己编译,安装。st-link不仅仅是我们下载代码的工具,更是我们使用gdb调试的基础。linux对USB虚拟串口的支持linux下自带虚拟串口的驱动。不需要手动安装。linux对串口的命转载 2021-04-01 14:41:07 · 366 阅读 · 0 评论 -
嵌入式开发常见问题解决方法
转载:https://www.cnblogs.com/jozochen/p/8541714.html一、问题复现稳定复现问题才能正确的对问题进行定位、解决以及验证。一般来说,越容易复现的问题越容易解决。1.1 模拟复现条件有的问题存在于特定的条件下,只需要模拟出现问题的条件即可复现。对于依赖外部输入的条件,如果条件比较复杂难以模拟可以考虑程序里预设直接进入对应状态。1.2 提高相关任务执行频率例如某个任务长时间运行才出现异常则可以提高该任务的执行频率。1.3 增大测试样本量程序长时间运行后出转载 2021-03-31 13:38:54 · 464 阅读 · 0 评论 -
Ardupilot工程waf配置技术要点
以下内容是将Ardupilot工程拆分成独立模块的测试结果1.如何配置工具链import syssys.path.insert(0, 'tools/ardupilotwaf/')def configure(cfg): cfg.env.TOOLCHAIN = 'arm-none-eabi-' cfg.load('toolchain')2.如何配置编译链接选项ardupilot/Tools/ardupilotwaf/boards.py3.如何配置源代码载具层和库层代码原创 2021-02-19 13:57:46 · 398 阅读 · 1 评论 -
使用条件断点测试堆溢出的方法(STM32 GCC)
下面是ubuntu16.04环境下,使用arm-none-eabi-gcc编译器,在STM32F427VIT6上测试堆溢出的方法1.测试代码#include <stdlib.h>void* ptr =0;int main(){ void* p =0; while(1){ p = malloc(10240); if(ptr < p){ ptr = p; } free(p); p = malloc(10240)原创 2021-02-05 18:28:18 · 303 阅读 · 0 评论 -
使用条件断点测试栈溢出的方法(STM32 GCC)
下面是ubuntu16.04环境下,使用arm-none-eabi-gcc编译器,在STM32F427VIT6上测试栈溢出的方法1.测试代码void myfunc(void){ char c[1] = {0x88}; myfunc();}int main(){ myfunc(); return 0;}2. 运行JLinkGDBServer和arm-none-eabi-gdbnohup JLinkGDBServer -if swd -device STM32F427VI原创 2021-02-05 17:31:04 · 316 阅读 · 0 评论 -
arm-none-eabi-gcc编译选项(ChibiOS)
demo: ChibiOS/demos/STM32/RT-STM32F407-DISCOVERYarm-none-eabi-gcc -c # 编译、汇编到目标代码,不进行链接 -mcpu=cortex-m4 # cpu架构的优化选项 -O2 # 更多的优化,会尝试几乎全部的优化功能,但不会进行“空间换时间”的优化方法 -ggdb # 为调试器 gd原创 2021-01-19 19:14:58 · 3760 阅读 · 1 评论