这周为了准备面试学了很多。
1.STM32远程升级。
flash分配如上图所示。上电首先运行bootload,bootload判断是否需要升级(服务器下发的更新标志),如果不需要升级则调到APP运行程序。如果需要升级则bootload连上升级服务器(ip和port之前应用程序已经从服务器下发得到),从升级服务器得到升级包后将升级包写入flash的0x08021000的起始地址。更新包下发完成后将更新包写入0x0800D000的起始地址。重启后bootload运行的就是更新程序了。
iar的icf文件配置:
bootload配置如下,中断向量表地址也要配置成0x08000000。APP程序一样的原理。
bootload跳转到应用程序过程:
__disable_irq(0; //关中断
SCB->VTOR = 0x0800D000; //中断向量表地址设置
JumpAddress = *(__IO uint32_t *)(userStartup + 4); //uint32_t JumpAddress
Jump_To_Application = (pFunction)JumpAddress; //typedef void (*pFunction)(void)
__set_MSP(*(__IO uint32_t *)userStartup); //设置堆栈指针
Jump_To_Application();
=========================================================================
2.ucosii
为了准备面试回顾了下ucosii.o (╥﹏╥)o
2.1 OSInit()
初始化全局变量,初始化TCB链表,初始化事件链表OSEventFreeList,消息队列。
创建空闲任务和计数任务.
2.2任务就绪表:
2.3信号量
OS_EVENT *OSSemCreate (INT16U cnt)
void OSSemPend (OS_EVENT *pevent, INT16U timeout, INT8U *perr)
INT8U OSSemPost (OS_EVENT *pevent)
2.4 邮箱
OS_EVENT *OSMboxCreate (void *pmsg)
void *OSMboxPend (OS_EVENT *pevent, INT16U timeout, INT8U *perr)
INT8U OSMboxPost (OS_EVENT *pevent, void *pmsg)
2.5 消息队列
OS_EVENT *OSQCreate (void **start, INT16U size)
void *OSQPend (OS_EVENT *pevent, INT16U timeout, INT8U *perr)
INT8U OSQPost (OS_EVENT *pevent, void *pmsg)