add ota algorithm for device

1. effective "Differential Upgrade" patch algorithm with high compression rate
2. effective recovery algorithm support recovery firmware in blocks which has low memory consumption and wear-leveling strategies, especially suitable for embeded devices with low RAM.
3. add sample ota bootloader project, see:
board\TencentOS_tiny_EVB_MX_Plus\KEIL\ota\ota_bootloader_recovery
4. add sample application project for download firmware through http, see:
board\TencentOS_tiny_EVB_MX_Plus\KEIL\ota\ota_application_download_through_http
5. add sample application project for download firmware through qcloud explorer console, see:
board\TencentOS_tiny_EVB_MX_Plus\KEIL\ota\ota_application_download_through_qcloud_iot_explorer
6. an OTA markdown document is pending
This commit is contained in:
daishengdong
2020-06-02 15:03:42 +08:00
parent 84faf16765
commit 5b51d50ade
177 changed files with 42367 additions and 1233 deletions

View File

@@ -71,8 +71,6 @@ __API__ k_err_t tos_bin_heap_create(k_bin_heap_t *bin_heap, void *pool, size_t i
*/
__API__ k_err_t tos_bin_heap_destroy(k_bin_heap_t *bin_heap);
#if TOS_CFG_MMHEAP_EN > 0u
/**
* @brief Create a binary heap with a dynamic allocated pool.
* create a binary heap with a dynamic allocated pool.
@@ -102,8 +100,6 @@ __API__ k_err_t tos_bin_heap_create_dyn(k_bin_heap_t *bin_heap, size_t item_cnt,
*/
__API__ k_err_t tos_bin_heap_destroy_dyn(k_bin_heap_t *bin_heap);
#endif
/**
* @brief Push an item.
* push an item into the binary heap.

View File

@@ -57,8 +57,6 @@ __API__ k_err_t tos_chr_fifo_create(k_chr_fifo_t *chr_fifo, void *buffer, size_t
*/
__API__ k_err_t tos_chr_fifo_destroy(k_chr_fifo_t *chr_fifo);
#if TOS_CFG_MMHEAP_EN > 0u
/**
* @brief Create a character fifo with a dynamic allocated buffer.
* Create a character fifo with a dynamic allocated buffer.
@@ -89,8 +87,6 @@ __API__ k_err_t tos_chr_fifo_create_dyn(k_chr_fifo_t *chr_fifo, size_t fifo_size
*/
__API__ k_err_t tos_chr_fifo_destroy_dyn(k_chr_fifo_t *chr_fifo);
#endif
/**
* @brief Push data into character fifo.
* Push one single data into the character fifo.

View File

@@ -20,10 +20,6 @@
#if TOS_CFG_EVENT_DRIVEN_EN > 0u
#if TOS_CFG_MMHEAP_EN == 0u
#error "INVALID config, must enable tos_mmheap to use event-driven"
#endif
#if TOS_CFG_TICKLESS_EN == 1u
#error "INVALID config, tickless not supported in event-driven yet"
#endif

View File

@@ -90,7 +90,7 @@
/////////////////////////////////////////
// enable mmheap
#ifndef TOS_CFG_MMHEAP_EN
#define TOS_CFG_MMHEAP_EN 1u
#define TOS_CFG_MMHEAP_EN 0u
#endif
#ifndef TOS_CFG_MMHEAP_DEFAULT_POOL_EN

View File

@@ -58,8 +58,6 @@ __API__ k_err_t tos_mail_q_create(k_mail_q_t *mail_q, void *pool, size_t mail_cn
*/
__API__ k_err_t tos_mail_q_destroy(k_mail_q_t *mail_q);
#if TOS_CFG_MMHEAP_EN > 0u
/**
* @brief Create a mail queue with dynamic allocated pool.
* create a mail queue with dynamic allocated pool.
@@ -88,8 +86,6 @@ __API__ k_err_t tos_mail_q_create_dyn(k_mail_q_t *mail_q, size_t mail_cnt, size_
*/
__API__ k_err_t tos_mail_q_destroy_dyn(k_mail_q_t *mail_q);
#endif
/**
* @brief Flush the mail queue.
* flush the mail queue.

View File

@@ -57,8 +57,6 @@ __API__ k_err_t tos_msg_q_create(k_msg_q_t *msg_q, void *pool, size_t msg_cnt);
*/
__API__ k_err_t tos_msg_q_destroy(k_msg_q_t *msg_q);
#if TOS_CFG_MMHEAP_EN > 0u
/**
* @brief Create a message queue with dynamic allocated pool.
* create a message queue with dynamic allocated pool.
@@ -86,8 +84,6 @@ __API__ k_err_t tos_msg_q_create_dyn(k_msg_q_t *msg_q, size_t msg_cnt);
*/
__API__ k_err_t tos_msg_q_destroy_dyn(k_msg_q_t *msg_q);
#endif
/**
* @brief Flush the message queue.
* flush the message queue.

View File

@@ -99,8 +99,6 @@ __API__ k_err_t tos_prio_q_create(k_prio_q_t *prio_q, void *mgr_array, void *poo
*/
__API__ k_err_t tos_prio_q_destroy(k_prio_q_t *prio_q);
#if TOS_CFG_MMHEAP_EN > 0u
/**
* @brief Create a priority queue with dynamic allocated mgr array and data pool.
* create a priority queue with dynamic allocated mgr array and data pool.
@@ -131,8 +129,6 @@ __API__ k_err_t tos_prio_q_create_dyn(k_prio_q_t *prio_q, size_t item_cnt, size_
*/
__API__ k_err_t tos_prio_q_destroy_dyn(k_prio_q_t *prio_q);
#endif
/**
* @brief Enqueue an priority queue.
* enqueue an item into the priority queue.

View File

@@ -65,8 +65,6 @@ __API__ k_err_t tos_ring_q_create(k_ring_q_t *ring_q, void *pool, size_t item_cn
*/
__API__ k_err_t tos_ring_q_destroy(k_ring_q_t *ring_q);
#if TOS_CFG_MMHEAP_EN > 0u
/**
* @brief Create a ring queue with dynamic allocated pool.
* create a ring queue with dynamic allocated pool.
@@ -97,9 +95,6 @@ __API__ k_err_t tos_ring_q_create_dyn(k_ring_q_t *ring_q, size_t item_cnt, size_
*/
__API__ k_err_t tos_ring_q_destroy_dyn(k_ring_q_t *ring_q);
#endif
/**
* @brief Enqueue an item.
* enqueue an item into the ring queue.

View File

@@ -196,8 +196,6 @@ __KNL__ __STATIC_INLINE__ void knl_object_deinit(knl_obj_t *knl_obj)
#endif
#if TOS_CFG_MMHEAP_EN > 0u
__KNL__ __STATIC_INLINE__ void knl_object_alloc_reset(knl_obj_t *knl_obj)
{
knl_obj->alloc_type = KNL_OBJ_ALLOC_TYPE_NONE;
@@ -223,8 +221,6 @@ __KNL__ __STATIC_INLINE__ int knl_object_alloc_is_static(knl_obj_t *knl_obj)
return knl_obj->alloc_type == KNL_OBJ_ALLOC_TYPE_STATIC;
}
#endif
__CDECLS_END
#endif /* _TOS_SYS_H_ */

View File

@@ -127,9 +127,7 @@ __API__ k_err_t tos_bin_heap_create(k_bin_heap_t *bin_heap, void *pool, size_t i
bin_heap->pool = (uint8_t *)pool;
TOS_OBJ_INIT(bin_heap, KNL_OBJ_TYPE_BINARY_HEAP);
#if TOS_CFG_MMHEAP_EN > 0u
knl_object_alloc_set_static(&bin_heap->knl_obj);
#endif
return K_ERR_NONE;
}
@@ -139,11 +137,9 @@ __API__ k_err_t tos_bin_heap_destroy(k_bin_heap_t *bin_heap)
TOS_PTR_SANITY_CHECK(bin_heap);
TOS_OBJ_VERIFY(bin_heap, KNL_OBJ_TYPE_BINARY_HEAP);
#if TOS_CFG_MMHEAP_EN > 0u
if (!knl_object_alloc_is_static(&bin_heap->knl_obj)) {
return K_ERR_OBJ_INVALID_ALLOC_TYPE;
}
#endif
bin_heap->total = 0;
bin_heap->cmp = K_NULL;
@@ -152,15 +148,11 @@ __API__ k_err_t tos_bin_heap_destroy(k_bin_heap_t *bin_heap)
bin_heap->pool = K_NULL;
TOS_OBJ_DEINIT(bin_heap);
#if TOS_CFG_MMHEAP_EN > 0u
knl_object_alloc_reset(&bin_heap->knl_obj);
#endif
return K_ERR_NONE;
}
#if TOS_CFG_MMHEAP_EN > 0u
__API__ k_err_t tos_bin_heap_create_dyn(k_bin_heap_t *bin_heap, size_t item_cnt, size_t item_size, k_bin_heap_cmp cmp)
{
void *pool;
@@ -208,8 +200,6 @@ __API__ k_err_t tos_bin_heap_destroy_dyn(k_bin_heap_t *bin_heap)
return K_ERR_NONE;
}
#endif
__API__ k_err_t tos_bin_heap_push(k_bin_heap_t *bin_heap, void *item, size_t item_size)
{
TOS_CPU_CPSR_ALLOC();
@@ -298,7 +288,7 @@ __API__ int tos_bin_heap_is_full(k_bin_heap_t *bin_heap)
TOS_OBJ_VERIFY_RC(bin_heap, KNL_OBJ_TYPE_BINARY_HEAP, K_FALSE);
TOS_CPU_INT_DISABLE();
is_full = (bin_heap->total == bin_heap->item_cnt);
is_full = (bin_heap->total == bin_heap->item_cnt ? K_TRUE : K_FALSE);
TOS_CPU_INT_ENABLE();
return is_full;

View File

@@ -30,9 +30,7 @@ __API__ k_err_t tos_chr_fifo_create(k_chr_fifo_t *chr_fifo, void *buffer, size_t
}
TOS_OBJ_INIT(chr_fifo, KNL_OBJ_TYPE_CHAR_FIFO);
#if TOS_CFG_MMHEAP_EN > 0u
knl_object_alloc_set_static(&chr_fifo->knl_obj);
#endif
return K_ERR_NONE;
}
@@ -44,11 +42,9 @@ __API__ k_err_t tos_chr_fifo_destroy(k_chr_fifo_t *chr_fifo)
TOS_PTR_SANITY_CHECK(chr_fifo);
TOS_OBJ_VERIFY(chr_fifo, KNL_OBJ_TYPE_CHAR_FIFO);
#if TOS_CFG_MMHEAP_EN > 0u
if (!knl_object_alloc_is_static(&chr_fifo->knl_obj)) {
return K_ERR_OBJ_INVALID_ALLOC_TYPE;
}
#endif
err = tos_ring_q_destroy(&chr_fifo->ring_q);
if (err != K_ERR_NONE) {
@@ -56,15 +52,11 @@ __API__ k_err_t tos_chr_fifo_destroy(k_chr_fifo_t *chr_fifo)
}
TOS_OBJ_DEINIT(chr_fifo);
#if TOS_CFG_MMHEAP_EN > 0u
knl_object_alloc_reset(&chr_fifo->knl_obj);
#endif
return K_ERR_NONE;
}
#if TOS_CFG_MMHEAP_EN > 0u
__API__ k_err_t tos_chr_fifo_create_dyn(k_chr_fifo_t *chr_fifo, size_t fifo_size)
{
k_err_t err;
@@ -104,8 +96,6 @@ __API__ k_err_t tos_chr_fifo_destroy_dyn(k_chr_fifo_t *chr_fifo)
return K_ERR_NONE;
}
#endif
__API__ k_err_t tos_chr_fifo_push(k_chr_fifo_t *chr_fifo, uint8_t data)
{
TOS_PTR_SANITY_CHECK(chr_fifo);

View File

@@ -33,9 +33,7 @@ __API__ k_err_t tos_mail_q_create(k_mail_q_t *mail_q, void *pool, size_t mail_cn
pend_object_init(&mail_q->pend_obj);
TOS_OBJ_INIT(mail_q, KNL_OBJ_TYPE_MAIL_QUEUE);
#if TOS_CFG_MMHEAP_EN > 0u
knl_object_alloc_set_static(&mail_q->knl_obj);
#endif
return K_ERR_NONE;
}
@@ -48,11 +46,9 @@ __API__ k_err_t tos_mail_q_destroy(k_mail_q_t *mail_q)
TOS_PTR_SANITY_CHECK(mail_q);
TOS_OBJ_VERIFY(mail_q, KNL_OBJ_TYPE_MAIL_QUEUE);
#if TOS_CFG_MMHEAP_EN > 0u
if (!knl_object_alloc_is_static(&mail_q->knl_obj)) {
return K_ERR_OBJ_INVALID_ALLOC_TYPE;
}
#endif
TOS_CPU_INT_DISABLE();
@@ -67,9 +63,7 @@ __API__ k_err_t tos_mail_q_destroy(k_mail_q_t *mail_q)
pend_object_deinit(&mail_q->pend_obj);
TOS_OBJ_DEINIT(mail_q);
#if TOS_CFG_MMHEAP_EN > 0u
knl_object_alloc_reset(&mail_q->knl_obj);
#endif
TOS_CPU_INT_ENABLE();
knl_sched();
@@ -77,8 +71,6 @@ __API__ k_err_t tos_mail_q_destroy(k_mail_q_t *mail_q)
return K_ERR_NONE;
}
#if TOS_CFG_MMHEAP_EN > 0u
__API__ k_err_t tos_mail_q_create_dyn(k_mail_q_t *mail_q, size_t mail_cnt, size_t mail_size)
{
k_err_t err;
@@ -131,8 +123,6 @@ __API__ k_err_t tos_mail_q_destroy_dyn(k_mail_q_t *mail_q)
return K_ERR_NONE;
}
#endif
__API__ k_err_t tos_mail_q_flush(k_mail_q_t *mail_q)
{
TOS_PTR_SANITY_CHECK(mail_q);

View File

@@ -34,9 +34,7 @@ __API__ k_err_t tos_msg_q_create(k_msg_q_t *msg_q, void *pool, size_t msg_cnt)
pend_object_init(&msg_q->pend_obj);
TOS_OBJ_INIT(msg_q, KNL_OBJ_TYPE_MESSAGE_QUEUE);
#if TOS_CFG_MMHEAP_EN > 0u
knl_object_alloc_set_static(&msg_q->knl_obj);
#endif
return K_ERR_NONE;
}
@@ -49,11 +47,9 @@ __API__ k_err_t tos_msg_q_destroy(k_msg_q_t *msg_q)
TOS_PTR_SANITY_CHECK(msg_q);
TOS_OBJ_VERIFY(msg_q, KNL_OBJ_TYPE_MESSAGE_QUEUE);
#if TOS_CFG_MMHEAP_EN > 0u
if (!knl_object_alloc_is_static(&msg_q->knl_obj)) {
return K_ERR_OBJ_INVALID_ALLOC_TYPE;
}
#endif
TOS_CPU_INT_DISABLE();
@@ -68,9 +64,7 @@ __API__ k_err_t tos_msg_q_destroy(k_msg_q_t *msg_q)
pend_object_deinit(&msg_q->pend_obj);
TOS_OBJ_DEINIT(msg_q);
#if TOS_CFG_MMHEAP_EN > 0u
knl_object_alloc_reset(&msg_q->knl_obj);
#endif
TOS_CPU_INT_ENABLE();
knl_sched();
@@ -78,8 +72,6 @@ __API__ k_err_t tos_msg_q_destroy(k_msg_q_t *msg_q)
return K_ERR_NONE;
}
#if TOS_CFG_MMHEAP_EN > 0u
__API__ k_err_t tos_msg_q_create_dyn(k_msg_q_t *msg_q, size_t msg_cnt)
{
k_err_t err;
@@ -132,8 +124,6 @@ __API__ k_err_t tos_msg_q_destroy_dyn(k_msg_q_t *msg_q)
return K_ERR_NONE;
}
#endif
__API__ k_err_t tos_msg_q_flush(k_msg_q_t *msg_q)
{
TOS_PTR_SANITY_CHECK(msg_q);

View File

@@ -180,9 +180,7 @@ __API__ k_err_t tos_prio_q_create(k_prio_q_t *prio_q, void *mgr_array, void *poo
prio_q->data_pool = (uint8_t *)pool;
TOS_OBJ_INIT(prio_q, KNL_OBJ_TYPE_PRIORITY_QUEUE);
#if TOS_CFG_MMHEAP_EN > 0u
knl_object_alloc_set_static(&prio_q->knl_obj);
#endif
return K_ERR_NONE;
}
@@ -192,11 +190,9 @@ __API__ k_err_t tos_prio_q_destroy(k_prio_q_t *prio_q)
TOS_PTR_SANITY_CHECK(prio_q);
TOS_OBJ_VERIFY(prio_q, KNL_OBJ_TYPE_PRIORITY_QUEUE);
#if TOS_CFG_MMHEAP_EN > 0u
if (!knl_object_alloc_is_static(&prio_q->knl_obj)) {
return K_ERR_OBJ_INVALID_ALLOC_TYPE;
}
#endif
prio_q_pool_mgr_deinit(&prio_q->pool_mgr);
prio_q_prio_mgr_deinit(&prio_q->prio_mgr);
@@ -208,15 +204,11 @@ __API__ k_err_t tos_prio_q_destroy(k_prio_q_t *prio_q)
prio_q->data_pool = K_NULL;
TOS_OBJ_DEINIT(prio_q);
#if TOS_CFG_MMHEAP_EN > 0u
knl_object_alloc_reset(&prio_q->knl_obj);
#endif
return K_ERR_NONE;
}
#if TOS_CFG_MMHEAP_EN > 0u
__API__ k_err_t tos_prio_q_create_dyn(k_prio_q_t *prio_q, size_t item_cnt, size_t item_size)
{
k_err_t err;
@@ -273,8 +265,6 @@ __API__ k_err_t tos_prio_q_destroy_dyn(k_prio_q_t *prio_q)
return K_ERR_NONE;
}
#endif
__STATIC__ void prio_q_do_enqueue(k_prio_q_t *prio_q, void *item, prio_q_slot_t slot, k_prio_t prio)
{
prio_q_item_copy_from(prio_q, item, slot);

View File

@@ -56,9 +56,7 @@ __STATIC_INLINE__ void ring_q_item_decrease(k_ring_q_t *ring_q)
ring_q->item_cnt = item_cnt;
TOS_OBJ_INIT(ring_q, KNL_OBJ_TYPE_RING_QUEUE);
#if TOS_CFG_MMHEAP_EN > 0u
knl_object_alloc_set_static(&ring_q->knl_obj);
#endif
return K_ERR_NONE;
}
@@ -68,11 +66,9 @@ __API__ k_err_t tos_ring_q_destroy(k_ring_q_t *ring_q)
TOS_PTR_SANITY_CHECK(ring_q);
TOS_OBJ_VERIFY(ring_q, KNL_OBJ_TYPE_RING_QUEUE);
#if TOS_CFG_MMHEAP_EN > 0u
if (!knl_object_alloc_is_static(&ring_q->knl_obj)) {
return K_ERR_OBJ_INVALID_ALLOC_TYPE;
}
#endif
ring_q->head = 0u;
ring_q->tail = 0u;
@@ -83,15 +79,11 @@ __API__ k_err_t tos_ring_q_destroy(k_ring_q_t *ring_q)
ring_q->item_cnt = 0u;
TOS_OBJ_DEINIT(ring_q);
#if TOS_CFG_MMHEAP_EN > 0u
knl_object_alloc_reset(&ring_q->knl_obj);
#endif
return K_ERR_NONE;
}
#if TOS_CFG_MMHEAP_EN > 0u
__API__ k_err_t tos_ring_q_create_dyn(k_ring_q_t *ring_q, size_t item_cnt, size_t item_size)
{
void *pool;
@@ -142,8 +134,6 @@ __API__ k_err_t tos_ring_q_destroy_dyn(k_ring_q_t *ring_q)
return K_ERR_NONE;
}
#endif
__API__ k_err_t tos_ring_q_enqueue(k_ring_q_t *ring_q, void *item, size_t item_size)
{
TOS_CPU_CPSR_ALLOC();

View File

@@ -255,7 +255,7 @@ __API__ k_err_t tos_task_create_dyn(k_task_t **task,
return K_ERR_TASK_OUT_OF_MEMORY;
}
stk_base = tos_mmheap_aligned_alloc(stk_size, sizeof(cpu_addr_t));
stk_base = tos_mmheap_alloc(stk_size);
if (!stk_base) {
tos_mmheap_free(the_task);
return K_ERR_TASK_OUT_OF_MEMORY;
@@ -349,9 +349,9 @@ __API__ k_err_t tos_task_prio_change(k_task_t *task, k_prio_t prio_new)
k_prio_t highest_pending_prio;
#endif
TOS_IN_IRQ_CHECK();
TOS_PTR_SANITY_CHECK(task);
TOS_OBJ_VERIFY(task, KNL_OBJ_TYPE_TASK);
TOS_IN_IRQ_CHECK();
if (unlikely(prio_new >= K_TASK_PRIO_IDLE)) {
return K_ERR_TASK_PRIO_INVALID;
@@ -497,9 +497,9 @@ __API__ k_err_t tos_task_delay_abort(k_task_t *task)
{
TOS_CPU_CPSR_ALLOC();
TOS_IN_IRQ_CHECK();
TOS_PTR_SANITY_CHECK(task);
TOS_OBJ_VERIFY(task, KNL_OBJ_TYPE_TASK);
TOS_IN_IRQ_CHECK();
TOS_CPU_INT_DISABLE();