标签: cortex-m3

gdb - 用于远程目标的generate-core-file?

我正在调试ARM的代码源版本的gdb(即arm-none-eabi-gdb)并尝试生成核心文件以供以后检查.OpenOCD是我的GDB目标.所有gdb告诉我,当我运行'gcore'或'generate-core-file'时,"无法创建corefile".有什么建议?通常可以使用远程目标进行核心转储吗?

gdb arm cortex-m3 codesourcery

6
推荐指数
1
解决办法
2043
查看次数

内部FLASH存储器中C结构的对齐

我有一个配置结构我想保存在ARM cortex M3的内部闪存上.根据规格,数据保存在内部闪存中,必须与32bit对齐.因为我有很多boolean和chars在我的结构中,我不想使用32位存储8位...我决定使用__packed预处理器编译指示打包结构,然后当我将它保存为整个结构时,我只需要确保结构大小可被4整除(4个字节= 32位),如果需要,我可以通过添加填充字节来实现.目前,在开发过程中我经常更改结构,并使其与32位对齐,我需要一直更改填充字节.目前,结构看起来很像

typedef __packed struct
{
uint8_t status;
uint16_t delay;
uint32_t blabla;
uint8_t foo[5];
uint8_t padding[...] // this has to be changed every time I alter the structure.
} CONFIG;
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来实现我正在做的事情?我是嵌入式编程的新手,我想确保我没有犯错误.

编辑:请注意.数据在内部闪存结束时保留,因此省略填充将无法正常工作......

c cortex-m3 memory-alignment iar

6
推荐指数
2
解决办法
4402
查看次数

NTP请求包

我试图弄清楚我需要在NTP请求包中发送(客户端)以从服务器检索NTP包.我正在使用Cortex M3上的LWIP,Stellaris LM3S6965

据我所知,我将接收UDP头,然后使用不同时间戳的NTP协议来消除延迟.我可能需要制作UDP标头,但我需要添加什么作为数据?

wireshark图片: 在此输入图像描述

我希望你们能帮助我.

udp cortex-m3 request ntp lwip

6
推荐指数
2
解决办法
2万
查看次数

在调试期间在IDE中显示printf消息

我们有一个设备,我想使用printf函数向IDE发送消息以进行调试.设置:

  • ARM Cortex-M3设备

  • ULINK2接口

  • uVision4 IDE

我已按照此链接中的说明操作,以便能够在"Debug(printf)Viewer"中查看消息.首先,我修改了"retarget.c"文件,将输出重定向到ITM界面:

#include <stdio.h>
#include <rt_misc.h>

#pragma import(__use_no_semihosting_swi)

// Para utilização do saida de debug através do ULINK2
#define ITM_Port8(n)    (*((volatile unsigned char *)(0xE0000000+4*n)))
#define ITM_Port16(n)   (*((volatile unsigned short*)(0xE0000000+4*n)))
#define ITM_Port32(n)   (*((volatile unsigned long *)(0xE0000000+4*n)))
#define DEMCR           (*((volatile unsigned long *)(0xE000EDFC)))
#define TRCENA          0x01000000

struct __FILE { int handle; /* Add whatever you need here */ };
FILE __stdout;

// Escreve caractere na porta de Debug
int sendchar (int ch)  { …
Run Code Online (Sandbox Code Playgroud)

debugging arm cortex-m3 keil

6
推荐指数
1
解决办法
8474
查看次数

ARM组装:绝对值功能:两行或三行更快?

在我的嵌入式系统类中,我们被要求将给定的C函数AbsVal重新编码到ARM Assembly中.我们被告知,我们能做的最好的是3行.我决心找到一个2行解决方案,并最终做到了,但我现在的问题是我是否真的降低了性能或增加了它.

C代码:

unsigned long absval(signed long x){
    unsigned long int signext;
    signext = (x >= 0) ? 0 : -1; //This can be done with an ASR instruction
    return (x + signet) ^ signext;
}
Run Code Online (Sandbox Code Playgroud)

TA /教授的3线解决方案

ASR R1, R0, #31         ; R1 <- (x >= 0) ? 0 : -1
ADD R0, R0, R1          ; R0 <- R0 + R1
EOR R0, R0, R1          ; R0 <- R0 ^ R1
Run Code Online (Sandbox Code Playgroud)

我的2线解决方案

ADD R1, R0, R0, ASR …
Run Code Online (Sandbox Code Playgroud)

optimization performance assembly arm cortex-m3

6
推荐指数
2
解决办法
6283
查看次数

编译Cortex M3裸机

是否有某个指南描述了如何让LLVM为Cortex-M3发出二进制文件,我可以按摩它来运行裸机?我花了相当多的时间在Windows和Ubuntu上使用LLVM无济于事.我可以得到类似ARM的装配.我可以得到一些代码,但我真正需要的是ELF,DWARF,Hobbit,Gandalf或任何其他具有文件格式规范的Lord of the Rings生物.任何和所有帮助表示赞赏!我正在Ubuntu,Windows和/或OS X上使用CLANG编译LLVM 3.4.

native cortex-m3 llvm c++11

6
推荐指数
2
解决办法
6244
查看次数

ARM程序集中.equ和.word之间的区别?

我很好奇 - 在定义常量时,ARM程序集中的.equ.word指令有什么区别?

assembly arm cortex-m3

6
推荐指数
2
解决办法
2万
查看次数

在运行时确定 ARM Cortex M3 RAM 大小

我正在为基于 STM32F103 的 ARM 微控制器(使用 GCC 编译)开发一些软件。我的一些用户希望能够对同一芯片的不同版本(具有更多 RAM)使用相同的二进制文件,因此我需要一种方法来找出运行时我有多少 RAM。

有一个地址 (0x1FFFF7E0) 包含闪存大小,但似乎没有包含 RAM 大小的地址!

显而易见的解决方案是运行内存地址检查哪些是可读/可写的,但我已经尝试过这个和芯片 HardFaults 从太高的 RAM 地址读取时(我不知道如何恢复)。

关于解决这个问题的最佳方法有什么想法吗?理想情况下,我会以实验方式进行,因为某些芯片(例如我现在使用的 STM32F103RCT6)实际上似乎具有 64kB 的 RAM,即使数据表表明它们有 48 个。例如,0x1FFFF7E0 寄存器报告 256kB 的可用闪存,即使 512kB 可用.

看起来我可以在 CCR 寄存器中设置 BFHFNMIGN 位,然后尝试从软件中断中访问内存 - 但是我不知道如何在 GCC+STM32 中调用或创建软件中断

ram gcc arm runtime cortex-m3

6
推荐指数
1
解决办法
4311
查看次数

freertos vTaskDelete(NULL)没有空闲内存

我开始学习FreeRTOS.刚才我正在尝试用这段代码创建一个打印任务函数:

static void vTaskPrint(void *pvParameters) {
    taskENTER_CRITICAL();
    printf("%s", (char *)pvParameters);
    printf("xPortGetFreeHeapSize: %d\r\n", xPortGetFreeHeapSize());
    taskEXIT_CRITICAL();
    vTaskDelete(NULL);
}
Run Code Online (Sandbox Code Playgroud)

但在14次致电之后:

xTaskCreate(vTaskPrint, (char *)"vTaskPrint", configMINIMAL_STACK_SIZE, (void *)buffer, 3, (xTaskHandle *)NULL);
Run Code Online (Sandbox Code Playgroud)

皮质M3内存不足:

************** TEST GPIO & LEDS FREERTOS OPEN103Z EVB **************
vTaskLeds
xPortGetFreeHeapSize: 7832
vTaskReadKeys
xPortGetFreeHeapSize: 7232
[INFO] vTaskPrint created successful
Key pressed RIGHT
xPortGetFreeHeapSize: 6632
[INFO] vTaskPrint created successful
Key pressed CENTER KEY
xPortGetFreeHeapSize: 6032
[INFO] vTaskPrint created successful
Key pressed RIGHT
xPortGetFreeHeapSize: 5432
[INFO] vTaskPrint created successful
Key pressed LEFT
xPortGetFreeHeapSize: 4832
[INFO] …
Run Code Online (Sandbox Code Playgroud)

cortex-m3 freertos

6
推荐指数
1
解决办法
2194
查看次数

当 Cortex-M3 出现硬故障时如何保留堆栈跟踪?

使用以下设置:

使用 JLinkGDBServer 和 eclipse 作为调试前端,我在单步执行我的代码时总是有一个很好的堆栈跟踪。使用 Code Confidence freertos 工具(eclipse 插件)时,我还会看到当前未运行的所有线程的堆栈跟踪(没有该插件,我只能看到活动线程的堆栈跟踪)。到现在为止还挺好。

但是现在,当我的应用程序陷入硬故障时,堆栈跟踪就会丢失。嗯,我知道如何找出导致hardfault代码地址的技术(如看到这里)。但与完整的堆栈跟踪相比,这是非常糟糕的信息。

好的,有时当陷入硬故障时,无法保留堆栈跟踪,例如,当堆栈被错误代码损坏时。但是如果堆栈是健康的,我认为获得堆栈跟踪是可能的(不是吗?)。

我认为在硬故障时丢失堆栈跟踪的原因是,Cortex-M3 架构会自动将堆栈指针从 PSP 切换到 MSP。现在的一个想法是,(也许)将 MSP 设置为之前的 PSP 值(并且可能需要做一些额外的堆栈准备?)。

关于如何做到这一点或其他方法在硬故障时保留堆栈跟踪的任何建议?

编辑 2015-07-07,添加了更多细节。

我使用此代码来引发硬故障:

__attribute__((optimize("O0"))) static void checkHardfault() {
    volatile uint32_t* varAtOddAddress = (uint32_t*)-1;
    (*varAtOddAddress)++;
}
Run Code Online (Sandbox Code Playgroud)

进入 时checkHardfault(),我的堆栈跟踪看起来不错:

gdb-> backtrace
#0  checkHardfault () at Main.cxx:179
#1  0x100360f6 in GetOneEvent () at Main.cxx:185 …
Run Code Online (Sandbox Code Playgroud)

c c++ cortex-m3 freertos

6
推荐指数
1
解决办法
3099
查看次数