标签: microcontroller

freeRTOS:如何在任务之间传递数据?

我正在寻找一个示例,它提供了在任务之间传递数据的正确方法:

假设我有一个显示器、键盘和一些传感器,例如。内部 ADC。我想在显示屏上显示所有传感器的值。按下按钮后,更改视图并呈现一些文本。按另一个后,返回值。

我会使用全局变量,但到处都将其描述为一个坏主意。另一方面,如果我使用队列(xQueueCreate、xQueueReceive、xQueueSend),我就不会有所有数据来显示它,并且我相信在接收它们后创建副本只会丢失内存。

c microcontroller stm32 freertos

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

stm32cubemx创建的FatFS支持的SD卡最大大小是多少

我使用的是STM32L476,它有一个SDMMC接口。我想要接口 SD 卡。我还想使用 STM32cubemx 中可用的 FatFs。它支持的最大SD卡尺寸是多少。

microcontroller sd-card stm32

2
推荐指数
1
解决办法
5716
查看次数

如何逆向工程/提取代码 ATmega32

我需要帮助从 ATmega32a 微控制器中提取代码。我有关于硬件、寄存器、汇编的知识,但我什至不是嵌入式系统的专家。尽管我知道逆向工程不适合初学者,但我仍然想至少学习我在网上找不到的基本概念。

如何与芯片通信、提取代码并反编译?为此有哪些硬件/软件要求?(假设代码不受保护。)

提前致谢。

microcontroller decompiling atmega reverse-engineering arduino

2
推荐指数
1
解决办法
5846
查看次数

如何使用一次只能读取32位的方法准确读取64位寄存器值?

之前面试的时候也遇到过这个问题,但是没有得到反馈。

由于它是一个寄存器,我是否需要在访问寄存器之前禁用中断以防止数据损坏?考虑使用两个缓冲区,32 位和 64 位,并将 32 位缓冲区发送到 read32() 中,并将其相应地转移到 64 位缓冲区。我们假设这是小端架构。

我在 repl.it 上编写了一个快速示例代码(输出与寄存器值不匹配

#include <stdio.h>
#include <string.h>
#include <stdint.h>

void read32(uint64_t *reg, uint32_t *buffer){
  memcpy(buffer, reg, 4);
}

int main(void) {
  
  //register
  uint64_t reg = 0xAAAAAAAAFFFFFFFF;
  
  //buffers
  uint32_t buf_32 = 0;
  uint64_t buf_64 = 0;

  //read LSW
  read32(&reg, &buf_32);
  buf_64 |= buf_32; //add LSW

  //read MSW
  read32(&reg+4, &buf_32);
  buf_64 |= ((uint64_t)buf_32 << 32);
  
  printf("64 bit register value: 0x%lx\n", buf_64);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

64 bit register value: …
Run Code Online (Sandbox Code Playgroud)

embedded microcontroller arm low-level-io

2
推荐指数
1
解决办法
1594
查看次数

哪个 UML 图应该用于用 C 语言编写的微控制器软件概述?

我想知道如何使用 UML 图来呈现软件概述。微控制器的代码将用 C 语言编写。所以,我猜我不能使用类图/对象图/复合结构图。然后,

  1. 我应该使用哪种 UML 图?

  2. 活动图可以用于此目的吗?如果是这样,有没有什么方法可以将所有活动组合在一个图表中以查看整个软件?

  3. 如果 UML 图不合适,那么哪一个最适合此目的?

提前致谢。

c microcontroller uml

2
推荐指数
1
解决办法
296
查看次数

为什么我在 proteus 中收到此错误:“PC=0x002A 处的操作码 0xFFFF 无效”

我用汇编语言为 avr atmega328P 编写了这段代码。它使用按钮打开和关闭 LED,但在 proteus 中我收到此错误:

PC=0x002A 处的无效操作码 0xFFFF

这是我的代码:

.INCLUDE "M328Pdef.inc"


ldi r16,HIGH(RAMEND)
out SPH, R16
ldi r16,LOW(RAMEND)
out SPL, R16

start:
ldi r16,0xFF
out DDRB,r16
ldi r17,0x00
out DDRD,r17
ldi r21,0x00
ldi r23,0x01

Forever:
in r20,PIND
cp r20,r21
BREQ ledon
cp r20,r23
BREQ ledoff
rjmp Forever


ledon:
ldi r22,0x01
out PORTB,r22 
ret

ledoff:
ldi r24,0x00
out PORTB,r24
ret

Run Code Online (Sandbox Code Playgroud)

有人有解决办法吗?

microcontroller assembly avr atmega32

2
推荐指数
1
解决办法
2634
查看次数

在 ISR 中计算整个程序有什么问题吗?

我有一个程序应该在 MCU(例如 STM32)上定期运行。例如,它应该每 1 毫秒运行一次。如果我编写一个 1ms ISR 并在其中调用我的完整程序,假设它不会超过 1ms,这是一个好方法吗?我可能会遇到什么问题吗?会很精确吗?

embedded microcontroller stm32 isr

2
推荐指数
1
解决办法
133
查看次数

在 C 中,为什么这个具有递增整数的“main”函数永远不会因溢出而崩溃?

main在C语言中,像stm32这样的嵌入式系统最基本的函数是:

int main(void) {
    int i = 0;

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

但是,由于i是一个整数,它不会溢出并因此在某些时候产生问题吗?

while(1) i++另外,在等待特定中断时使用相同的策略(使用 )循环是否安全?

编辑:感谢您的所有回答。我很遗憾不知道溢出处理程序与 C 和 C++ 有很大不同。现在我明白了 !

c embedded microcontroller stm32

2
推荐指数
1
解决办法
370
查看次数

调用strcpy后尝试释放内存会导致程序崩溃

我知道很多人在这里抱怨strcpy,但我没有找到任何使用搜索来解决我的问题.

首先,调用strcpy本身不会导致任何类型的崩溃/分段错误.其次,代码包含在一个函数中,第一次调用这个函数它完美地运行.它只在第二次崩溃.

我正在用LPC1788微控制器编程; 内存非常有限,所以我可以看到为什么像malloc这样的东西可能会失败,但不是免费的.

函数trimMessage()包含代码,函数的目的是删除大字符串数组的一部分,如果它变得太大.

void trimMessage()
{
  int trimIndex;
  // currMessage is a globally declared char array that has already been malloc'd
  // and written to.
  size_t msgSize = strlen(currMessage);

  // Iterate through the array and find the first newline character. Everything
  // from the start of the array to this character represents the oldest 'message'
  // in the array, to be got rid of.
  for(int i=0; i < msgSize; i++)
  {
    if(currMessage[i] == '\n')
    {
      trimIndex = i; …
Run Code Online (Sandbox Code Playgroud)

c microcontroller lpc

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

引导程序是否需要运行固件?

我目前正在研究Stellaris ARM微控制器板的固件,我正在运行SYS/BIOS RTOS.

当我上传固件时,我想知道主板上是否需要引导加载程序.我可以使用.bin文件覆盖闪存上的引导加载程序,或者我是否需要偏移起始地址以保留引导加载程序.

c embedded microcontroller rtos bootloader

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