我正在寻找一个示例,它提供了在任务之间传递数据的正确方法:
假设我有一个显示器、键盘和一些传感器,例如。内部 ADC。我想在显示屏上显示所有传感器的值。按下按钮后,更改视图并呈现一些文本。按另一个后,返回值。
我会使用全局变量,但到处都将其描述为一个坏主意。另一方面,如果我使用队列(xQueueCreate、xQueueReceive、xQueueSend),我就不会有所有数据来显示它,并且我相信在接收它们后创建副本只会丢失内存。
我使用的是STM32L476,它有一个SDMMC接口。我想要接口 SD 卡。我还想使用 STM32cubemx 中可用的 FatFs。它支持的最大SD卡尺寸是多少。
我需要帮助从 ATmega32a 微控制器中提取代码。我有关于硬件、寄存器、汇编的知识,但我什至不是嵌入式系统的专家。尽管我知道逆向工程不适合初学者,但我仍然想至少学习我在网上找不到的基本概念。
如何与芯片通信、提取代码并反编译?为此有哪些硬件/软件要求?(假设代码不受保护。)
提前致谢。
microcontroller decompiling atmega reverse-engineering arduino
之前面试的时候也遇到过这个问题,但是没有得到反馈。
由于它是一个寄存器,我是否需要在访问寄存器之前禁用中断以防止数据损坏?考虑使用两个缓冲区,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(®, &buf_32);
buf_64 |= buf_32; //add LSW
//read MSW
read32(®+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) 我想知道如何使用 UML 图来呈现软件概述。微控制器的代码将用 C 语言编写。所以,我猜我不能使用类图/对象图/复合结构图。然后,
我应该使用哪种 UML 图?
活动图可以用于此目的吗?如果是这样,有没有什么方法可以将所有活动组合在一个图表中以查看整个软件?
如果 UML 图不合适,那么哪一个最适合此目的?
提前致谢。
我用汇编语言为 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)
有人有解决办法吗?
我有一个程序应该在 MCU(例如 STM32)上定期运行。例如,它应该每 1 毫秒运行一次。如果我编写一个 1ms ISR 并在其中调用我的完整程序,假设它不会超过 1ms,这是一个好方法吗?我可能会遇到什么问题吗?会很精确吗?
main在C语言中,像stm32这样的嵌入式系统最基本的函数是:
int main(void) {
int i = 0;
while(1) {
i++;
}
}
Run Code Online (Sandbox Code Playgroud)
但是,由于i是一个整数,它不会溢出并因此在某些时候产生问题吗?
while(1) i++另外,在等待特定中断时使用相同的策略(使用 )循环是否安全?
编辑:感谢您的所有回答。我很遗憾不知道溢出处理程序与 C 和 C++ 有很大不同。现在我明白了 !
我知道很多人在这里抱怨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) 我目前正在研究Stellaris ARM微控制器板的固件,我正在运行SYS/BIOS RTOS.
当我上传固件时,我想知道主板上是否需要引导加载程序.我可以使用.bin文件覆盖闪存上的引导加载程序,或者我是否需要偏移起始地址以保留引导加载程序.
microcontroller ×10
c ×5
embedded ×4
stm32 ×4
arduino ×1
arm ×1
assembly ×1
atmega ×1
atmega32 ×1
avr ×1
bootloader ×1
decompiling ×1
freertos ×1
isr ×1
low-level-io ×1
lpc ×1
rtos ×1
sd-card ×1
uml ×1