标签: cortex-m

Ada on STM32F4(Cortex-M4)

我只是偶然发现了这篇文章,说明Ada语言的端口存在于Cortex-M4微处理器中.这看起来令人兴奋,但不幸的是我在AdaCore上没有发现这样的迹象.

我们的目标是STM32F407或STMF417裸机.Ada的实时扩展对我们来说至关重要.

我们最好使用工具的GPL版本.但是,作为一所大学,我们可以访问相应大学版的开发套件.

任何人都可以在Cortex-M4甚至STM32上与Ada分享经验吗?

我最终找到了正确的下载,甚至包括STM32F4的示例项目.凉.

ada bare-metal stm32 cortex-m

7
推荐指数
1
解决办法
2975
查看次数

STM32内部时钟

我对STM32F7器件(STMicroelectronics的Cortex-M7微控制器)上的时钟系统感到困惑.参考手册没有充分说明这些时钟之间的差异:

  • SYSCLK
  • HCLK
  • FCLK

参考手册在"5.2时钟>> "章节中读取."RCC通过AHB时钟(HCLK)除以8来提供Cortex系统定时器(SysTick)的外部时钟".
这个陈述与CubeMX的数字相矛盾.请注意,在CubeMX中,我可以选择从HCLK到'Cortex系统定时器'的预分频器.它不一定是8分.

在此输入图像描述

arm clock stm32 cortex-m stm32f7

7
推荐指数
1
解决办法
4394
查看次数

为什么在arm-none-eabi GCC上`uint32_t`类型定义为`unsigned long`,以及如何更改它?

我正在使用arm-none-eabi-gcc7.4 为基于 ARM Cortex-M4 的微控制器(特别是 EFM32WG940,但这应该与问题无关)编译“裸机”程序。

据我所知,sizeof(int)sizeof(long int)与未签名的对应物一起都是4. 实际上,您必须输入long long int才能获取 64 位整数(或int64_t),因此long int似乎完全是多余的。

在这种环境下,为什么__UINT32_TYPE__ 预定义宏定义为long unsigned int

有没有办法改变uint32_tunsigned int

通常这不会困扰我,但它会让printf我感到困难,因为-Wformat。考虑类似:(printf("hello %u\n", i);假设iuint32_t)这给了我一个警告,因为%u期望unsigned但是uint32_tunsigned long。显然我可以将其更改为%lu,但在 x86 上编译时相同的代码会给我一个警告。

编辑:

是的,一种沉默的方法-Wformat是使用这样的格式宏:虽然实际上并没有回答我的问题,但如果代码不是那么丑陋,并且一些静态分析器没有问题,那将是最好的。inttypes.hprintf("hello %" PRIu32, i);

我不想破解我所有的 …

c gcc arm cortex-m

7
推荐指数
1
解决办法
6196
查看次数

精确的机器代码副本运行速度比原始功能慢50%

我一直在尝试从嵌入式系统上的RAM和闪存执行性能。为了快速进行原型制作和测试,我目前使用的是Arduino Due(SAM3X8E ARM Cortex-M3)。据我所知,Arduino运行时和引导程序在这里应该没有任何区别。

问题出在这里:我有一个用ARM Thumb Assembly编写的函数(calc)。calc计算一个数字并将其返回。(对于给定的输入,> 1s运行时)现在,我手动提取了该函数的汇编机器代码,并将其作为原始字节放入另一个函数中。确认这两个功能都驻留在闪存中(地址0x80149和0x8017D紧挨着)。通过反汇编和运行时检查已确认了这一点。

void setup() {
  Serial.begin(115200);
  timeFnc(calc);
  timeFnc(calc2);
}

void timeFnc(int (*functionPtr)(void)) {
  unsigned long time1 = micros();

  int res = (*functionPtr)();

  unsigned long time2 = micros();
  Serial.print("Address: ");
  Serial.print((unsigned int)functionPtr);
  Serial.print(" Res: ");
  Serial.print(res);
  Serial.print(": ");
  Serial.print(time2-time1);
  Serial.println("us");

}

int calc() {
   asm volatile(
      "movs r1, #33 \n\t"
      "push {r1,r4,r5,lr} \n\t"
      "bl .in \n\t"
      "pop {r1,r4,r5,lr} \n\t"
      "bx lr \n\t"

      ".in: \n\t"
      "movs r5,#1 \n\t"
      "subs r1, r1, #1 …
Run Code Online (Sandbox Code Playgroud)

performance assembly arm arduino cortex-m

7
推荐指数
1
解决办法
97
查看次数

STM32 I-CODE 和 D-CODE 总线

STM32 文档说 I-CODE 和 D-CODE 总线连接到内部闪存。I-CODE 总线用于获取指令,D-CODE 总线用于代码存储区中的数据访问(文字加载)。

问题是为什么要使用两条独立的总线?它们能否提供对闪存的同时且绝对独立的访问?

arm stm32 cortex-m

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

Cortex-M4F 惰性 FPU 堆叠

我正在为 Cortex M4F 编写线程代码。一切正常,我现在正在研究通过惰性堆栈使 FPU 上下文切换更有效。

我读过 ARM 的AN298,并实现了基于禁用 FPU 和处理UsageFault 的替代方法,但较低的 ( S0-S15) 寄存器没有被硬件正确保存/恢复。我认为问题出在图11:

图11 上下文切换

据此,当PendSV运行时FPCAR应该指向任务A的堆栈中保留的空间。但正如我所见,由于CONTROL.FPCA在任务 C 中处于高位,FPCAR因此在进入 PendSV 时将更新为指向任务 C 的堆栈。如果是这样,S0-S15并且FPSCR将被保存到任务C的堆栈而不是任务A的堆栈中,这当然是不正确的。

我在这里遗漏了什么,还是应用程序注释错误?

附带说明一下,我检查了一些开源 RTOS。FreeRTOS 和 mbed RTOS 始终S16-S31在上下文切换期间进行堆栈,从而导致自动S0-S15堆栈,即它们仅使用惰性堆栈来减少中断延迟,但对任务进行完整的状态保存(如应用笔记中概述的第一种方法)。M4F 的 TNKernel 端口使用UsageFault 方法,但S0-S31通过软件完全保存/恢复,有效地绕过任何问题FPCAR(以 48 次加载/存储而不是 32 次为代价,16 个硬件加载/存储在恢复时被覆盖)。似乎没有人在只保留S16-S31.

(顺便说一句,这也发布在ARM Community 上,但那里似乎有很多问题没有答案。如果我在那里得到答案,我也会在这里复制它)

arm fpu context-switch cortex-m

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

CLION中的GDB Monitor命令

我正在尝试使用远程GDB调试嵌入式项目.我的系统:

  • 目标:ARM Cortex M0.
  • SEGGER J-Link GDB服务器V6.10命令行版本
  • arm-none-eabi-gdb 7.10.1.20160616-cvs
  • CLion 2016.2.2,Build#CL-162.1967.7
  • Ubuntu 16.04

我的.gdbinit文件中有以下内容:

target remote localhost:2331 #(I remove this line when debugging with CLion)
set verbose on
file "/path_to_output_file/blinky.elf"
monitor reset
break main
Run Code Online (Sandbox Code Playgroud)

几天来困扰我的事情是,如果我直接从终端调试gdb,这可以正常工作,但是当我在CLion中使用调试器时却没有.在CLion我收到错误:

此目标不支持"monitor"命令.

我的理论是终端接受"监视器重置"命令(至少它没有抱怨).另一方面,CLion会打印错误,但之后会显示继续执行而不进行重置.结果似乎是当我在CLion中启动一个新的调试会话时,我不会在main()的开头开始.

CLion是否阻止了监视器命令?如果是这样,那么为什么并且有解决方法?

我觉得我的问题可能与CPP-7322CPP-7256有关.

debugging jlink gdbserver cortex-m clion

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

Cortex M - IRQ 禁用的原子性

我花了几个小时试图回答我的问题,但找不到任何令人满意的答案。

由于 ARM Cortex-M 内核没有任何指令来读取全局中断掩码(PRIMASK 寄存器)的状态并立即禁用它,因此所有框架都使用以下两条指令的序列:

mrs r0, PRIMASK ; Read current state
cpsid i         ; Mask IRQs
Run Code Online (Sandbox Code Playgroud)

但是没有解释,为什么这段代码被认为是原子的......当IRQ出现在这两条指令的执行之间并且IRQ处理程序改变PRIMASK的状态时会发生什么?喜欢

mrs r0, PRIMASK ; Read current state
; Some weird IRQ handling happens here and changes PRIMASK
cpsid i         ; Mask IRQs
Run Code Online (Sandbox Code Playgroud)

由于这段代码被广泛使用,我怀疑(架构?)设计永远不会发生这种情况。有人可以向我解释为什么吗?:-) 谢谢!

assembly arm atomicity cortex-m

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

如何在 Raspberry Pico 上的第二个核心上运行代码

我正在尝试让多核在我的 pico 上工作,

#include <stdio.h>
#include "pico/stdlib.h"
#include "pico/multicore.h"

void core1_main()
{

    stdio_init_all();

    while (1)
    {
        uint32_t t = multicore_fifo_pop_blocking();
        printf("hellow world %d \n", t);
    }
}

int main()
{
    multicore_launch_core1(&core1_main);
    uint32_t i = 0;

    while (1)
    {
        sleep_ms(250);
        multicore_fifo_push_blocking(i++);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我正在努力完成的一项非常基本的任务。我正在尝试更多地了解这个多核魔法。基本上我开始等待 core1 来获取一些数据。然后我简单地打印出来并等待下一条数据。在核心 0 上,我每 250 毫秒将一个数字推送到 FIFO 一次。
我在编译时没有收到任何错误,但运行代码不会产生任何输出。
我在这里做错了什么?有什么我应该注意的吗?

我已经尝试了很多方法来获得多核,但没有用。

更新 这给了我一些输出。我添加了等待 USB 连接和初始化的时间。现在我从 core 2 收到一些消息。

#include <stdio.h>
#include "pico/stdlib.h"
#include "pico/multicore.h"

// const uint led = PICO_DEFAULT_LED_PIN;

void core1_main()
{
    printf("hellow world from second …
Run Code Online (Sandbox Code Playgroud)

c microcontroller cortex-m raspberry-pi-pico

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

测量 ARM MCU 中断延迟的问题

介绍

\n

我是一名学生,想在不使用示波器的情况下粗略测量ARM Cortex-M系列芯片的中断延迟。然而,我遇到了一个非常奇特的问题,让我非常困惑。

\n

首先,让我简要概述一下我的测量方法。我尝试使用MCU的内置定时器粗略地测量中断延迟。我的基本想法如下:在进入中断服务程序(ISR)之前,我将计时器重置为零。然后,我将生成一个中断请求并进入 ISR。进入 ISR 后,我会立即读取计时器的值。此时,计时器值可以作为中断延迟的非常粗略的估计。

\n

由于某些原因,我需要使用汇编语言编写上述ISR函数。在主函数中,我使用 SWIER 寄存器生成一个软件中断,这允许我进入我编写的 ISR。

\n

I encountered a peculiar issue during this process. When writing an ISR in Assembly language, it is customary to push several registers onto the stack upon entering the function, such as R4 to R11, and pop them back when exiting the function. Therefore, in theory, if I don\'t push the registers onto the stack upon entering the ISR (assuming I don\'t use those registers within …

c assembly arm stm32 cortex-m

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