gpt4 book ai didi

c - 使用指针功能 - 1 台设备上的 2 个独立应用程序

转载 作者:太空宇宙 更新时间:2023-11-03 23:40:50 24 4
gpt4 key购买 nike

我前段时间问过这个问题How can I use one function from main application and bootloader? (embedded)并开始实现建议的解决方案,但遇到了一些问题。

在我的 cortex M4 I 上,有 2 个独立的应用程序 - 引导加载程序和用户应用程序。现在我有一些(许多)功能对于两个应用程序都是相同的。所以我只为引导加载程序编译它们,然后在指定地址创建一个函数指针数组,这是用户应用程序已知的。所以在应用中,我没有再用那些函数编译文件,而是在需要的时候使用那些指针。

这是我试图为两个应用程序通用的代码示例:

static uint8_t       m_var_1;

// Sends events to the application.
static void send_event(fs_op_t const * const p_op, fs_ret_t result)
{
uint8_t var_2;
[...]
}

我的应用程序以 Hardfault 结束,这发生在例如除以零或使用指向具有 NULL 值的函数的指针时。我还不确定为什么,但我开始想知道这些变量会发生什么。 var_2 肯定会位于堆栈中,所以这没问题。但是 m_var_1 呢?在映射文件中,它在 RAM 中有一个指定的位置。但我没有用于应用程序和引导加载程序的单独 RAM 部分。我不确定,但我感觉这个变量可能使用与为引导加载程序创建时相同的 RAM 位置。这可能吗?也许还有其他问题?

最佳答案

是的,您是对的,代码将尝试在与加载器链接的相同位置访问全局变量。这是因为链接涉及用编译后确定的地址替换所有出现的标识符(包括函数名和变量名)。

在您的应用程序中,变量,即使它确实存在于那里,也可能位于不同的地址。函数的调用恰好有效,因为它们位于 ROM 中,并且对于应用程序和加载程序来说不能不同。通过同样存储在 ROM 中的 const 指针调用它们可以绕过这个问题。

解决方案是使用文件系统模拟器,如果您能为您的硬件找到一个模拟器的话。

否则你会讨厌必须执行以下操作。

第 1 部分,设置:

  • 引入一个特殊的链接器部分,其中包含两个系统文件(应用程序和加载程序)访问的所有变量
  • 让一个链接器填充它
  • 为其他链接器将其设置为 don't-tocuh
  • 注意初始化
    • 最好不要假设任何初始化值
    • 如果您需要初始化,例如“bss”(初始化为 0)或“数据”(初始化为指定值),
      在与您设置变量的链接器无关的系统部分的开头明确执行此操作
    • 为了安全起见,建议在两个系统部分以相同的方式执行初始化
    • “数据”init 使用一个特殊的非 volatile 链接器部分,其中包含要初始化的变量的副本,可以访问它

第 2 部分,访问:

  • 选项 1)
    存储指向这些变量的常量指针,就像您为函数所做的那样
  • 选项2)
    获取第二个链接器(另一个链接器,它没有对公共(public)变量部分进行实际设置)以创建与第一个链接器中的部分结构相同且位置相同的部分;此处需要进一步研究您的链接器

第三部分,获取其他系统部分存储的值
(例如,您想从加载程序中留下某种消息,以便阅读我的应用程序)

  • 设计哪个系统部分初始化哪个变量,另一个只读取它们
  • 将公共(public)变量分成四个部分,
    • 由两个系统部分写入和读取,由两个部分初始化
    • 由x写入和读取,仅由y读取,由x初始化
    • 由y写入和读取,仅由x读取,由y初始化
    • 由两个系统部分编写,未初始化,使用校验和和合理性 cehcks,
      如果一个变量还没有被初始化,初始化为默认值
  • 只在相应的writer系统部分初始化每个section
  • 在另一个链接器中设置为“无初始化”
  • 在第四种情况的两个链接器中都设置为“no init”
  • 在第四种情况下使用具有校验和更新和合理性的 getter 和 setter

要做到这一切,需要深入研究您的链接器功能和语法。
所以我建议不要尝试,如果你能绕过它。考虑使用现有的文件系统模拟器;因为这基本上就是上面的意思。

关于c - 使用指针功能 - 1 台设备上的 2 个独立应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46520290/

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