gpt4 book ai didi

c - 依赖重置设计模式(嵌入式C)

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

伙计们,我正在开发一个使用 I2C 模块的 C 嵌入式系统。其他使用 I2C 的模块将 I2C 模块作为依赖项或“子系统”。他们将消息上下文结构传递给它,当 I2C 模块准备就绪时,它会按照上下文指示异步发送或读取消息,从上下文运行回调以让上层模块知道工作已完成,成功或出错。

我希望 I2C 模块能够从错误中恢复,即重置外部连接的硬件,然后重新初始化外部设备。这三个 Action 中的前两个可以在 I2C 模块内部毫无问题地处理,但是 I2C 模块不知道哪些覆盖模块可能想要使用它,并且需要将数据发送到外部设备以在它们较早的之后再次配置它们硬件重置。

消息上下文可以有对重新初始化函数的回调,但是 I2C 模块一次只保留对其中一个的引用,它当前正在处理的那个它如何知道下一次调用重新初始化句柄不同的模块(带复位硬件)想和它的外部硬件对话?上层模块不知道 I2C 已被重置,并且 I2C 模块不知道上层模块是否已执行其重新初始化序列,或者即使它需要执行。

有没有通用的设计模式来改善这样的问题?

以不同的方式说明:

I2C 和外部硬件序列的正常初始化:

initExtIOExpander() {
context_t initialisationMsg = {/*...*/};
i2cSend(&initialisationMsg )
}

initExtADC() {
context_t initialisationMsg = {/*...*/};
i2cSend(&initialisationMsg )
}

i2cSend() {
// Start sending data using passed context,
}

interrupt i2c_isr() {
//If the message completed run the callback handle in the current context
// else do the next part of the message, etc.
}

main () {
//...
initI2c();
initExtIOExpander();
initExtADC();
//...
// Use external devices here.
//
}

重置和重新初始化序列:如果上面的正常序列已经发生,但现在 I2C ISR 被更改为检测错误:

interrupt i2c_isr () {
//If there was an error reset external H/W, and own H/W
// but how to know to call initExtIOExpander() and initExtADC()??
// this module might know about the ADC if it is processing and ADC
// message but it has "forgotten" about the IO expander or any other
// device
// else if the message completed run the callback handle in the current
// context
// else do the next part of the message, etc.
}

谢谢!

最佳答案

如何将所有设备初始化为“聚合”函数并在需要时调用它?

void init_all_i2c_devices(void) {
initExtIOExpander();
initExtADC();
...
}

interrupt i2c() {
....
init_all_i2c_devices();// or i2c_init_callback()
}

main() {
init_i2c();
init_all_i2c_devices();
// set_i2c_init_callback(init_all_i2c_devices) if need
}

关于c - 依赖重置设计模式(嵌入式C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23362686/

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