forked from xuos/xiuos
1.add an API of finding the first user task in xiuos task manage list; 2.add restart application after ota
This commit is contained in:
@@ -1,12 +1,12 @@
|
||||
# OTA README
|
||||
|
||||
xiuos当前的ota功能允许应用bin文件可以通过4G实现远程的bin文件更新(限制:1、bin文件存放在设备SD卡并且应用从SD卡启动;2、暂且支持4G实现;3、暂时只支持aiit终端)。
|
||||
xiuos当前的ota功能允许应用bin文件可以通过4G实现远程的bin文件更新(限制:1、bin文件存放在设备SD卡并且应用从SD卡启动;2、暂且支持4G实现;3、暂时只支持aiit终端;4、只支持xiuos内核)。
|
||||
|
||||
## 文件说明
|
||||
|
||||
| 名称 | 说明 |
|
||||
| -- | -- |
|
||||
| ota.c| 设备OTA代码 |
|
||||
| ota.c| xiuos设备OTA代码 |
|
||||
| ota_server.c | pc服务端的实例代码供参考 |
|
||||
|
||||
|
||||
|
||||
@@ -22,6 +22,8 @@
|
||||
#include <transform.h>
|
||||
#include <adapter.h>
|
||||
|
||||
extern int main(void);
|
||||
|
||||
struct ota_header_t
|
||||
{
|
||||
int16 frame_flag; ///< frame start flag 2 Bytes
|
||||
@@ -47,7 +49,8 @@ struct ota_data
|
||||
struct ota_frame_t frame;
|
||||
};
|
||||
|
||||
pthread_t ota_ktask;
|
||||
pthread_t ota_task;
|
||||
pthread_t restart_main;
|
||||
|
||||
/**
|
||||
* @description: CRC16 check
|
||||
@@ -117,6 +120,26 @@ static int CrcFileCheck(uint32 crc_check, unsigned long total_len)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void RestartApplication(void)
|
||||
{
|
||||
pthread_attr_t attr;
|
||||
attr.schedparam.sched_priority = 10;
|
||||
attr.stacksize = 2048;
|
||||
|
||||
while(1)
|
||||
{
|
||||
unsigned long pid = PrivUserTaskSearch();
|
||||
if (pid > 0)
|
||||
{
|
||||
PrivTaskDelete(pid, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
PrivTaskCreate(&restart_main, &attr, (void *)main, NULL);
|
||||
}
|
||||
static int OtaDataRecv(struct Adapter* adapter)
|
||||
{
|
||||
struct ota_data recv_msg;
|
||||
@@ -172,6 +195,7 @@ try_again:
|
||||
}
|
||||
}
|
||||
close(fd);
|
||||
RestartApplication();
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -233,6 +257,6 @@ void ApplicationOtaTaskInit(void)
|
||||
attr.schedparam.sched_priority = 10;
|
||||
attr.stacksize = 2048;
|
||||
|
||||
PrivTaskCreate(&ota_ktask, &attr, OtaKTaskEntry, NULL);
|
||||
PrivTaskCreate(&ota_task, &attr, OtaKTaskEntry, NULL);
|
||||
|
||||
}
|
||||
@@ -79,6 +79,11 @@ int PrivTaskStartup(pthread_t *thread)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
/* private API of xiuos to search the first user task in manage list */
|
||||
int PrivUserTaskSearch(void)
|
||||
{
|
||||
return UserTaskSearch();
|
||||
}
|
||||
|
||||
int PrivTaskDelete(pthread_t thread, int sig)
|
||||
{
|
||||
|
||||
@@ -171,6 +171,7 @@ int PrivTaskStartup(pthread_t *thread);
|
||||
int PrivTaskDelete(pthread_t thread, int sig);
|
||||
void PrivTaskQuit(void *value_ptr);
|
||||
int PrivTaskDelay(int32_t ms);
|
||||
int PrivUserTaskSearch(void);
|
||||
|
||||
/*********************driver*************************/
|
||||
|
||||
|
||||
@@ -99,6 +99,7 @@ int pthread_setcanceltype(int type, int *oldtype)
|
||||
int pthread_kill(pthread_t thread, int sig)
|
||||
{
|
||||
/* This api should not be used, and will not be supported */
|
||||
UserTaskDelete(thread);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
@@ -60,6 +60,7 @@ int32_t UserTaskCreate(UtaskType utask);
|
||||
|
||||
long UserTaskStartup(int32_t id);
|
||||
long UserTaskDelete(int32_t id);
|
||||
long UserTaskSearch(void);
|
||||
void UserTaskQuit(void);
|
||||
long UserTaskDelay(int32_t ms);
|
||||
long UserGetTaskName(int32_t id ,char *name);
|
||||
@@ -185,6 +186,7 @@ int32_t UserTaskCreate(UtaskType utask);
|
||||
#define UserTaskDelete KTaskDelete
|
||||
#define UserTaskQuit KTaskQuit
|
||||
#define UserTaskDelay MdelayKTask
|
||||
#define UserTaskSearch UTaskSearch
|
||||
|
||||
long UserGetTaskName(int32_t id ,char *name);
|
||||
int32_t UserGetTaskID(void);
|
||||
|
||||
@@ -60,6 +60,17 @@ x_err_t UserTaskDelete(int32_t id){
|
||||
return (x_err_t)KSwitch1(KS_USER_TASK_DELETE,(uintptr_t)id);
|
||||
}
|
||||
|
||||
/**
|
||||
* This function will find the first user task in task manage list.
|
||||
*
|
||||
* @param
|
||||
*
|
||||
* @return task id on success; EINVALED on failure
|
||||
*/
|
||||
x_err_t UserTaskSearch(void){
|
||||
return KSwitch0(KS_USER_TASK_SEARCH);
|
||||
}
|
||||
|
||||
void UserTaskQuit(void){
|
||||
KSwitch0(KS_USER_TASK_EXECEXIT);
|
||||
return ;
|
||||
|
||||
Reference in New Issue
Block a user