器件型号:TI-RTOS
工具/软件:TI-RTOS
您好!
在我的应用中、有3个初始化级别:
- MCU 外设(SPI、I2C、UART 等)驱动程序初始化 -通过调用 Board_Init 在 main ()内部发生 ()在 BIOS_start()之前
- 外部外设初始化(开关、ADC、其他传感器)-有两个限制:
- 必须在 MCU 外设(SPI、UART)初始化之后调用
- 必须在任务上下文中调用、因为它使用 TI-RTOS 驱动程序 API (I2C_TRANSFORT()等)
- 任务(应用级)初始化和 while (1)循环。 这些任务依赖先前的外部外设初始化
现在、问题从上面的2b 开始-
由于(例如)模拟开关必须在任务上下文(上面按2b)内通过 I2C 进行初始化、因此当它开始运行时、它会在任务 A 中被调用(假设具有最高优先级)。
由于 I2C_transfer ()是一个阻塞调用,因此任务 A 阻断,任务 B,C & D 开始执行。
但是、任务 B/C/D 使用仍由任务 A 初始化的外部外设
我希望我能够成功地传达这个问题...
克服这种同步排序问题的一种方法是使用一个"非重置信标"(类似于.NET ManualResetEvent 对象)、该任务是在外部外设完成初始化并使任务 B/C/D 挂起后由任务 A 设置的。
我通过将计数信标计数值设置为(例如) 100 (及其上的待处理任务 B/C/D)来寻找穷人对这个概念的实施、但找不到和 Semaphore_setCount() API。
另一种方法是使用一个事件、并让任务 A 在外设初始化后设置事件的所有位、并在事件的每个位上挂起任务 B/C/D。
这也会失败、因为一次只能有一个任务在事件上挂起...
第三种方法是仅运行任务 A、并让它仅在初始化完成后启动任务 B/C/D。
由于任务 B/C/D 是静态创建的、因此我找不到一种方法来阻止它们运行
是否有任何设计模式/同步对象可用于此方案?
我们非常感谢您的任何建议。