事情是这样的,我想用我的 USB 串口刷新我的 stm32 板。我的stm32板带有一块带有CH340的扩展板。
当我将开发板连接到计算机时,我可以使用命令看到该设备lsusb
,输出为Bus 001 Device 039: ID 1a86:7523 QinHeng Electronics CH340 serial converter
。
ttyUSB
但我在路径下找不到该文件/dev
。
然后我运行dmesg | grep tty
,这是输出:
[1182096.667353] usb 1-9: ch341-uart converter now attached to ttyUSB0
[1182096.729868] audit: type=1130 audit(1637925474.011:3648): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=brltty-device@sys-devices-pci0000:00-0000:00:14.0-usb1-1\x2d9 comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success'
[1182096.800144] audit: type=1130 audit(1637925474.081:3649): pid=1 uid=0 auid=4294967295 ses=4294967295 msg='unit=brltty@-sys-devices-pci0000:00-0000:00:14.0-usb1-1\x2d9 comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=success'
[1182096.803145] usb 1-9: usbfs: interface 0 claimed by ch341 while 'brltty' …
Run Code Online (Sandbox Code Playgroud) 我不是专业的C程序员,我知道包括.c
来自另一个的源文件被认为是不好的做法,但我认为它有助于可维护性.
我有一个包含大量元素的大结构,我#define
用来保存索引.
#define TOTO_IND 0
#define TITI_IND 1
…
#define TATA_IND 50
static const MyElements elems [] = {
{"TOTO", 18, "French"},
{"TITI", 27, "English"},
...,
{"TATA", 45, "Spanish"}
}
Run Code Online (Sandbox Code Playgroud)
因为我需要从索引访问结构,所以我需要保持#define
和结构声明同步.这意味着我必须在正确的位置插入新元素并相应地更新#define
.
它容易出错,我不喜欢它(但出于性能考虑,我找不到更好的解决方案).
无论如何,这个文件还包含很多处理这个结构的函数.我还希望保持代码分离并避免全局变量.
为了使事情变得"更容易",我正在考虑将这个"容易出错的定义"转移到.c
仅包含此结构的单个源文件中.这个文件将是"危险的小心文件",并将其包含在我的实际"正常功能"文件中.
你怎么看待这件事?包含.c
源文件是否有效?还有另一种更好的方法来处理我的结构吗?
我目前正在开发一个嵌入式项目(STM32F103RB,CooCox CoIDE v.1.7.6 with arm-none-eabi-gcc 4.8 2013q4),我试图了解当RAM满时如何malloc()
表现C
.
我的STM32有20kB = 0x5000Bytes的RAM,0x200用于堆栈.
#include <stdlib.h>
#include "stm32f10x.h"
struct list_el {
char weight[1024];
};
typedef struct list_el item;
int main(void)
{
item * curr;
// allocate until RAM is full
do {
curr = (item *)malloc(sizeof(item));
} while (curr != NULL);
// I know, free() is missing. Program is supposed to crash
return 0;
}
Run Code Online (Sandbox Code Playgroud)
一旦堆太小而无法分配,我希望malloc()
能够返回NULL
:
0x5000
(RAM) - 0x83C
(bss) - 0x200
(堆栈)= 0x45C4
(堆) …
我正在为STM32嵌入式系统调试这个软件.在其中一个函数中,我的程序一直在遇到某种断点:
SIGTRAP,跟踪/断点陷阱
但是,在GDB中,当info breakpoints
我得到时No breakpoints or watchpoints
.断点实际上对应于我在很久以前设置的断点,在另一个版本的可执行文件中.当我设置断点时,GDB告诉我automatically using a hardware breakpoint on read-only memory
(或类似的消息).
我认为硬件断点仍然在我的芯片上,尽管已经加载了新版本的软件.如果确实存在虚假断点,我该如何找到并删除它?
我正在使用ARM Cortex M3芯片(STM32F2),ST提供"标准外设库".它有一些有用的.c和.h文件.它还有.s文件.
在C项目的上下文中这些.s文件的目的是什么?如何获取编译器/链接器/?把它们考虑进去?
有人介绍如何使用binutils和newlib构建llvm + clang工具链以及如何使用它?
我正在试图弄清楚如何使用这个新的HAL驱动程序.我希望使用HAL_UART_Receive_IT()
设置设备的数据来接收数据时运行中断功能.
问题是你必须在中断触发之前指定要读取的数据长度.我计划像不同长度的命令一样发送控制台,因此不能有固定的长度.我假设唯一的方法是一次读取单个字符并构建一个单独的字符串.
HAL驱动程序似乎有一个问题,如果您设置HAL_UART_Receive_IT()
接收x
字符数,然后尝试发送多个x
字符,将出现错误.
目前我不知道我是否正确的方式,任何想法?
我正在开发一个基于Cortex-M3的自定义设备,我需要实现应用程序内编程(IAP)机制,这样就可以在没有JTAG的情况下更新设备固件(我们将使用TFTP或HTTP).虽然ST Microelectronics提供的与IAP相关的代码示例对我来说足够清楚,但我并不真正了解重新闪存的工作原理.
据我所知,CPU通过ICode总线(当然还有预取块)从Flash获取指令.所以,这是我非常愚蠢的问题:为什么运行程序在重新闪烁时会被破坏(即更改运行它的闪存)?
由于许可证问题,我有一个应用程序,我从Keil IDE移植到使用GNU工具链构建.我已经成功地能够在设备上设置,构建,刷新和运行应用程序.
GNU端的应用程序由于某种原因被卡在WWDG的弱链接IRQ处理程序中,这是一个无限循环.应用程序未启用WWDG,默认情况下在重置时禁用.我还验证了配置寄存器的默认启动值.
除编译器之外,唯一的区别是链接器和启动文件.但是,两个工具链使用的启动文件和链接器文件都是STM生成的默认值.
知道可能导致这种情况的原因吗?我在这里结束了我的智慧.
使用stm32f103XX,让我知道是否有任何其他信息会有所帮助.
编辑:使用下面的评论,我能够确定它实际上是正在被触发的HardFault_Handler.如果可能有帮助,我已经在下面包含了回溯输出
GDB BT:
0 HardFault_Handler()
1(信号处理程序调用)
2 0x720a3de在?? ()
3 foo(0x80005534)
Backtrace已停止:前一帧与此帧相同(损坏的堆栈?)
2件事对我来说很突出,虽然我没有gdb专家.1)foo不是一个函数,它是一个const数组的字符和2)0x0720a3de不是一个有效的内存地址,闪存地址范围从0x08000000开始
我正在开发一个裸机 STM32 项目,在 Linux x64 主机上进行编译。
将我的工具链从 升级到 后gcc-arm-none-eabi-11.2-2022.02
,arm-gnu-toolchain-11.3.rel1-x86_64-arm-none-eabi
我收到以下链接器警告:
warning: _close is not implemented and will always fail
warning: _fstat is not implemented and will always fail
warning: _getpid is not implemented and will always fail
warning: _isatty is not implemented and will always fail
warning: _kill is not implemented and will always fail
warning: _lseek is not implemented and will always fail
warning: _open is not implemented and will always fail
warning: _read is not …
Run Code Online (Sandbox Code Playgroud)