- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我希望这是对我的问题的清晰解释,我已经在各种手册上跑了一个多星期了,现在正在尝试解决这个问题:
最近,在 STM32 Nucleo-F334R8 上进行反馈和测试后,我一直在为一个类(class)项目重新设计软件设计(我最初的代码充满了内存和时序错误)
目前我遇到两个主要错误:
When processing USART Data using USART 1 in Asynchronous mode at 115200 Baudrate:
Program received signal SIGTRAP, Trace/breakpoint trap. 0x08002c08 in memset ()
Program received signal SIGTRAP, Trace/breakpoint trap. 0x08002c08 in memset ()
Program received signal SIGTRAP, Trace/breakpoint trap. 0x08002c08 in memset ()
Program received signal SIGTRAP, Trace/breakpoint trap. 0x08002c08 in memset ()
Program received signal SIGTRAP, Trace/breakpoint trap. 0x080056b4 in std.isra ()
存储在相关地址 0x08002c08 处的值通常非常大 大的通常是十进制的 134228385。另外如果我 强制单步解决问题,程序继续运行良好 并且再也没有遇到这个问题,我觉得很奇怪 可能的原因?
更新:所以 我已经追踪了一点 memset 问题,发现它发生了 在我
setOutputBuffer
期间方法:String>,%5d,%8s,%3d,%3d,%3d,%4d,%4d,%4d,%10.6f,%11.6f,%7.1f,%3d,%3.1f\n",uptime,timeString,temperature,pressure,humidity,acc1,acc2,acc3,latitude,longitude,altitude,current,voltage);
} ``` Which leads me to believe the issue lies in finding a value that
is being used to set the Output buffer message.
I would like advice on how to further troubleshoot these two issues
and whether there is a chance that the memset error is related the
later bss error.
My String Tokenizing code(edited):
```c void tokenize(char* in){ const char *p = in; const char
delim[] = ","; char *token = NULL; uint8_t n = 0;
do{
size_t length = strcspn(p, delim); if(length > 0){ if(token ==
NULL){
token = malloc(sizeof(char)*length); // create memory space for the token
memset(token, 0, length); // ensure initialized memory is blank
sprintf(token, "%.*s",(int)length,p); // store the token from a substring of Input Buffer
p+=length; // move pointer to next ','
parseToken(token, n); // extract information from the token be it latitude, longitude etc
memset(token, 0, length); // clear the token
free(token); // free up the token's spot in memory
token = NULL; // set token pointer to null
n++; }
}
}while(*((++p)+1) != '*'); // The expected string ends with a
checksum character '*' after the last ',' } ``` I've re-examined the
function and made a lot of changes now I can successfully step through
the entire function without issue, the program then returns to my main
loop, and I let it run for a while but then I suddenly run back into
the same memset issue, even without receiving any bytes over USART
here is the code for my main loop and the subsequent function calls it
makes:
```c
while (1) {
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
if (byteFlag){ byteRecieved(); byteFlag = 0; }
if(msgFlag){ msgRecieved(); msgFlag = 0; }
if(secFlag){ setOutputBuffer(); HAL_UART_Transmit(&huart1,
(uint8_t *)bufferOut, 91, 1000); secFlag = 0; }
} ``` byteReceived: ```c if((char) byteIn == '$'){
clearInputBuffer(); } else if((char) byteIn == '\n'){
msgFlag = 1; }
else{ storeChar(); } ```
msgReceived: ```c if(isValid()){ if (checksum()) {
tokenize(bufferIn); clearInputBuffer(); } } ```
isValid: ```c char substr[5]; strncpy(substr, (bufferIn+1), 5);
if(!strcmp(substr, "GPGGA")){ return 1; }
return 0; ```
checksum: ```c int checksum(){ int calc_checksum = 0; int
in_checksum; int i = 0; char checkstr[2]; uint8_t hasCheckSum = 0;
for(int j = 0; j<91; j++){ if (bufferIn[j] == '*') { hasCheckSum
= 1; i = 1; } }
if (hasCheckSum) { while (bufferIn[i] != '*'){ calc_checksum ^=
bufferIn[i]; i++; } checkstr[0] = bufferIn[i+1]; checkstr[1]
= bufferIn[i+2]; } else {return 0;}
in_checksum = parseStr_HexToInt(checkstr);
if (calc_checksum == in_checksum){ return 1; } else { return 0;
} } ```
clearInputBuffer: ```c void clearInputBuffer(){ int i = 0;
for(i = 0; i < 100; i++){ bufferIn[i] = ' '; } bufferIn[0] = '$';
} ```(此问题已解决)
本质上,我的问题的根源是滥用
sprintf
并用空字符覆盖程序代码I encountered a breakpoint trap while filling the bss segment of the board's memory
And after adding Seven GPIO Ports for a 4bit mode LCD(namely PA12, PA11, PB12, PB11, PB2, PB1, PB15) and two for a two channel ADC in DMA mode (PA1, PA0):
Program received signal SIGTRAP, Trace/breakpoint trap. LoopFillZerobss () at ..\startup/startup_stm32f334x8.s:103 103 cmp r2, r3 While trying to implement LCD and ADC functionality I receive the breakpoint trap error during the LoopFillZerobss function of startup which proved fatal, particularly by stopping my USART from reporting at all(however it can still receive bytes as interrupt and process tokens etc, just refuses to transmit), After reading up into the bss segment I attempted to solve the issue by initializing as many global variables as I could to non-zero values, this did not work, the problem is observed after adding the STM32CubeMx settings for ADC and the 7 GPIO pins used in the LCD, however none of these use unitialized variables to my knowledge unless the predefined code generated by CubeMX is going beyond the bounds of the bss segment of memory and that the size of the bss segment is too large now for the board's memory (which I suspect is unlikely but can't rule out).
本质上,这个项目的想法是通过 USART、ADC 和后来的 I2C 接收各种数据,并通过 USART 和 LCD 显示当前数据的各个方面,如果我丢弃 ADC 和 LCD 错误,我的 USART 代码将充当 memset( )错误是非致命的,但我怀疑将其留在那里只会导致我以后出现问题,但我也不确定在哪里修复我的标记化代码,假设它是我问题的根源。
最佳答案
通过确保使用 snprintf
而不是 sprintf
以及明确定义大小的字符串,我不再遇到内存问题。
关于c - 修复 STM32 Nucleo-F334R8 上可能由于 malloc 导致的内存覆盖错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55876836/
我的定时器 TIM3 上的正交编码器模式有问题 STM32F446RE/ NUCLEO-F446RE : TIM3 在第一个信号的每个上升沿计数。CNT 寄存器计数,我以 1 Hz 读取该值,然后我将
当我将其加载到板上时,会得到未发现外围错误的引脚图。 我对此问题(One of the pages I visited)进行了一些研究,我认为我理解了这个问题, 但是,我使用的所有引脚都完全支持我要它
编辑: 解决方案是调低初始化 block 中的 I2C 时钟。尽管 STM 可以处理它,但 LCD 的数据表表明它只能处理高达 10kHz 的频率。 对于 DMA,必须在 CubeMX 软件中启用和设
我正在使用 STM32F401RE 从压力传感器采样数据。使用此函数,我可以使用 printf() 使用“Tera Term”在终端上打印数据。 int _write(int file, char *
我最近买了一个 STM-NUCLEO我正在尝试写入连接到 LED 的 PA0、PA1、PA2、PA3。连接到 PA0 和 PA1 的 LED 按预期点亮,但 PA2 和 PA3 没有。我用 PA4 试
我是整个stm32环境的新手。我过去一直使用 arduino,我想为这个项目尝试一些新东西。 我很难在 nucleo 板(MASTER)和 arduino(SLAVE)之间建立 i2c 连接。 我已经
我正在使用 arm-none-eabi 工具链为 Nucleo 创建二进制文件,然后使用它提供的 USB 虚拟存储设备将其闪存到 Nucleo。 我正在用 -ggdb 编译程序。但是我怎么可能连接到
我正在寻找一个命令行工具来在 ubuntu 中刷新我的 NUCLEO 卡。我想要这个工具使用 node.js 远程刷新我的 NUCLEO。我已经尝试过 st-flash 和 stm32flash 但这
我正在尝试通过 i2c 读取加速度计数据。加速度计的i2c地址为0x19用于读取,0x18用于写入。为了检查与加速度计的通信是否正确,我应该读取寄存器 0x00,并且它必须返回 0x12 作为结果
我尝试在 NUCLEO-F746ZG 上创建一个 UDP 回显服务器,但是当我启动客户端时,我的主板只给出一个答案。 这是我的线程代码: static void udpecho_thread(void
我正在尝试弄清楚如何切换 Nucleo 板上的 LED,但我只是看不到用户 LED 切换。在线查看似乎这就是您所要做的。有没有其他人遇到过这个问题? #include "stm32f4xx.h" #i
我正在尝试通过 STM32CubeIDE 仅使用寄存器来打开 nucleo 板内的 LED(原理图中的 LD2)。 用户手册声明了时钟、模式和数据寄存器的以下地址: Led pin: PA5 Addr
STM32F401RE --> CortexM4我使用 SPI1 和 HAL 低级驱动程序 STM32CubeF4。我使用了以下 SPI 配置:- SPI_HandleTypeDef hspi; hs
我可以使用 mbed 在线 IDE 从 Windows-7 成功编译并运行 LED 闪烁示例,该 IDE 在我的 NUCLEO F091C 板上运行。 如何实现 printf? 有一个输出到串行的示例
我正在尝试编写一个裸机程序来闪烁绿色 LED。事实上,我无法打开或关闭任何 LED。这是一个现成的板。主板名称为 NUCLEO F429ZI。 Board Image 我已经浏览了原理图,并且确信引脚
我想使用Nucleo L053R8的crc计算单元计算3字节的CRC值。生成多项式如下:g(X)=x^24 + x^10 + x^9 + x^6 + x^4 + x^3 + x + 1 看来使用这个C
我想在STM32(Nucleo-F401RE)上使用DMA配置ADC,并通过SPI将值传输到Basys 3 FPGA。在通过SPI传输之前,当我使用STMSTudio实时读取内存中的值时,它是不稳定的
我希望这是对我的问题的清晰解释,我已经在各种手册上跑了一个多星期了,现在正在尝试解决这个问题: 最近,在 STM32 Nucleo-F334R8 上进行反馈和测试后,我一直在为一个类(class)项目
我将 Flir Lepton 相机连接到了我的主板上,并且借助 ThermalView 程序(源代码:https://github.com/groupgets/LeptonModule/tree/ma
uint32_t PAGEError = 0; FLASH_EraseInitTypeDef EraseInitStruct; EraseInitStruct.TypeErase = FLASH_
我是一名优秀的程序员,十分优秀!