Other Parts Discussed in Thread: CC2745R10-Q1
器件型号: CC2745R10-Q1
TI 团队大家好、
我正在使用 FreeRTOS 和 iCall/OSAL 为 CC2745R10-Q1 器件开发定制的 CAN/UDS 引导加载程序。
我的当前流程为:
-
BOARD_INIT ()
-
iCall_init()
-
iCall_createRemoteTasks ()
-
引导判定逻辑
-
vTaskStartScheduler()
在引导决策阶段(调用前)vTaskStartScheduler(),我尝试使用 OSAL API ,例如:
用户_osal_read()
User_osal_Write ()
但是、在调度器启动之前、这些 API 无法正常运行(挂起,无法获得关于终止调试会话的控制权)。 vTaskStartScheduler()调用 API 并且在任务上下文中使用 API 后、它们将按预期工作。
我想澄清以下几点:
-
之前不能使用 OSAL API 的预期行为
vTaskStartScheduler()是什么? -
OSAL 是否严格要求 FreeRTOS 任务上下文才能运行?
-
OSAL 是否与 BLE 栈紧密耦合、或者是否可以单独使用?
-
在不启用或运行 BLE 栈的情况下是否可以使用 OSAL?
-
对于引导加载程序用例(无需 BLE 功能)、建议使用什么方法在调度器启动之前访问 NVM 服务?
-
使用不带 BLE 的 iCall/OSAL 时、TI 是否为 CC27xx 器件推荐了引导加载程序架构?
我的目标是:
-
执行引导决策(跳转到应用程序或保持在引导状态)
-
如果可能、使用基于 OSAL 的 NVM 存储
-
避免在引导加载程序中启用 BLE 堆栈
请参考 Boot Manager main():
unsigned char osal_ret_val = 0;
内部 main (void)
{
pthread_t thread;
pthread_attr_t attrs;
结构 sched_param priParam;
内部视网膜;
int uds_schedular;
uint32_t reloadValue =0;
Watchdog_Handle watchdogHandle;
unsigned char MAIN_EEPROM_READ[4]={0};
unsigned char MAIN_EEPROM_CLEAR[2]={0x00,0x00};
unsigned char MAIN_EEPROM_READ_1[2]={0xA5、0x02};
unsigned char MAIN_EEPROM_READ_TEST[4]={0};
unsigned char Security_timer_enable[2]={0};
/*注册应用程序回调到在堆栈中提出的陷阱断言*/
halAssertBack=AssertHandler;
RegisterAssertBack(AssertHandler);
/*初始化系统锁*/
board_init ();//时钟和外设的初始化。
/*更新堆栈的用户配置*/
user0Cfg.appServiceInfo->timerTickPeriod = iCall_getTickPeriod ();
user0Cfg.appServiceInfo->timerMaxMillisecond = iCall_getMaxMSecs();
/*初始化所有应用程序任务*/
///hzjk();
/*初始化 iCall 模块*/
iCall_init();
/*启动外部映像的任务 — 优先级 5 */
iCall_createRemoteTasks ();
CheckAndClearResetCause ();//重置原因。
/*看门狗初始化*/
watchdog_initialization();
OSAL_ret_val = USER_OSAL_READ (e_JUMP_FROM_APPLN_FLAG_FOR_BOOT_ID、 MAIN_EEPROM_READ);
if (MAIN_EEPROM_READ[0]== 0xA5)/*(如果从应用程序跳转)//
{
USER_OSAL_Write (e_JUMP_FROM_APPLN_FLAG_FOR_BOOT_ID、MAIN_EEPROM_CLEAR);
init_boot();
}
暴露
{
To_Appln ();
}
Software_Timer_Init ();//软件计时器初始化
xTaskCreate (Tp_Scheduler_Task、“CAN NULL“、STACK_SIZE、Tp_Scheduler_Task、4、 空);
xTaskCreate (uds_scheduler_task、“uds_scheduler_task",“,stack_size、stack_size、NULL、3、 空);
machly_boot_entry();
/*启动 FreeRTOS 调度程序*/
vTaskStartScheduler();
返回 0;
}
我希望获得关于正确架构方法的指导。
谢谢你。