gpt4 book ai didi

arm - STM32编程技巧和问题

转载 作者:行者123 更新时间:2023-12-02 20:15:36 27 4
gpt4 key购买 nike

我在互联网上找不到任何关于STM32编程的好文档。 STM自己的文档除了寄存器功能之外没有解释任何内容。如果有人能解释我的以下问题,我将不胜感激?

  1. 我注意到,在 STM 提供的所有示例程序中,main() 的局部变量总是在 main() 函数之外定义(偶尔使用 static 关键字)。这有什么理由吗?我应该遵循类似的做法吗?我应该避免在 main 中使用局部变量吗?

  2. 我有一个全局变量,它在时钟中断句柄内更新。我在另一个函数中使用相同的变量作为循环条件。我不需要使用某种形式的原子读取操作来访问这个变量吗?我如何知道时钟中断在函数执行过程中不会改变其值?每次需要在函数内使用此变量时,是否都需要取消时钟中断? (但是,这对我来说似乎非常无效,因为我将其用作循环条件。我相信应该有更好的方法来做到这一点)。

  3. Keil自动插入用汇编语言编写的启动代码(即startup_stm32f4xx.s)。该启动代码具有以下导入语句: 导入系统初始化 导入__main.在“C”中,这是有道理的。然而,在 C++ 中,main 和 system_init 具有不同的名称(例如 _int_main__void)。即使不使用“extern“C””,这个启动代码如何仍然可以在C++中工作(我尝试过并且它有效)。 C++ 链接器 (armcc --cpp) 如何将这些语句与正确的函数关联起来?

最佳答案

您可以使用本地或全局变量,在嵌入式系统中使用本地变量存在堆栈与数据冲突的风险。对于全局变量,你就没有这个问题。但无论您身在何处,嵌入式微 Controller 、台式机等,这都是事实。

我会在使用它的前台任务中创建全局的副本。

unsigned int myglobal;

void fun ( void )
{
unsigned int myg;

myg=myglobal;

然后只使用 myg 来完成函数的其余部分。基本上,您正在拍摄快照并使用快照。如果您正在读取寄存器,如果您想根据某事物的样本执行多项操作,则您会想做同样的事情,获取其中的一个样本并根据该样本做出决定,否则该项目可能会在样本之间发生变化。如果您使用一个全局变量与中断处理程序来回通信,那么我将使用两个变量,一个用于前台中断,另一个用于前台中断。是的,有时您需要仔细管理这样的共享资源,通常这与您需要做不止一件事的时候有关,例如,如果您之前有多个项目都需要作为一个组进行更改处理程序可以看到它们发生变化,那么您需要禁用中断处理程序,直到所有项目都发生变化。嵌入式微 Controller 没有什么特别之处,这都是您在具有成熟操作系统的桌面系统上看到的所有基本内容。

Keil 知道他们在做什么,如果他们支持 C++,那么他们就会从系统层面解决这个问题。我不使用 Keil,我对像这样的微 Controller 使用 gcc 和 llvm。

编辑:

这是我正在谈论的内容的示例

https://github.com/dwelch67/stm32vld/tree/master/stm32f4d/blinker05

stm32使用基于定时器的中断,中断处理程序修改与前台任务共享的变量。前台任务获取共享变量的单个快照(每个循环),如果需要,可以在循环中多次使用该快照,而不是可以更改的共享变量。这是 C 而不是 C++ 我明白这一点,并且我使用的是 gcc 和 llvm 而不是 Keil。 (注意 llvm 在优化紧密 while 循环方面存在已知问题,非常老的错误,不知道为什么他们没有兴趣修复它,llvm 适用于本示例)。

关于arm - STM32编程技巧和问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8107108/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com