AWTK 在腾讯 TOS 上的移植笔记

2019-12-09 13:34发布

本帖最后由 lixianjing 于 2019-11-9 08:48 编辑

AWTK 在腾讯 TOS 上的移植笔记
本文以 STM32f103ze 为例,介绍了 AWTK 在 RTOS 上移植的经验。与其说移植,倒不如说是集成。因为 RTOS 通常没有提供标准的 LCD 驱动接口,显示部分并不需要特别的改动。所做的事情不过是把 AWTK 放到 RTOS 的一个线程中执行而已。

1. 加入 TOS 相关文件。
AWTK 已经移植到 STM32f103ze 裸系统上,为了简单起见,直接在 awtk-stm32f103ze-raw 基础上加入 TOS 支持。

在 Keil 中增加下列文件:


  1. TencentOS/kernel/core/tos_event.c
  2. TencentOS/kernel/core/tos_fifo.c
  3. TencentOS/kernel/core/tos_global.c
  4. TencentOS/kernel/core/tos_mmblk.c
  5. TencentOS/kernel/core/tos_mmheap.c
  6. TencentOS/kernel/core/tos_msg.c
  7. TencentOS/kernel/core/tos_mutex.c
  8. TencentOS/kernel/core/tos_pend.c
  9. TencentOS/kernel/core/tos_queue.c
  10. TencentOS/kernel/core/tos_robin.c
  11. TencentOS/kernel/core/tos_sched.c
  12. TencentOS/kernel/core/tos_sem.c
  13. TencentOS/kernel/core/tos_sys.c
  14. TencentOS/kernel/core/tos_task.c
  15. TencentOS/kernel/core/tos_tick.c
  16. TencentOS/kernel/core/tos_time.c
  17. TencentOS/kernel/core/tos_timer.c
  18. TencentOS/kernel/pm/tos_pm.c
  19. TencentOS/kernel/pm/tos_tickless.c
  20. TencentOS/arch/arm/arm-v7m/common/tos_cpu.c
  21. TencentOS/arch/arm/arm-v7m/common/tos_fault.c
  22. TencentOS/arch/arm/arm-v7m/cortex-m3/armcc/port_c.c
  23. TencentOS/arch/arm/arm-v7m/cortex-m3/armcc/port_s.S
复制代码

增加 include 的路径


  1. TencentOS/arch/arm/arm-v7m/common/include
  2. TencentOS/arch/arm/arm-v7m/cortex-m3/armcc
  3. TencentOS/kernel/core/include
  4. TencentOS/kernel/hal/include
  5. TencentOS/kernel/pm/include
  6. TencentOS/TOS-CONFIG
复制代码

修改配置文件
根据自己的需要修改配置 TencentOS/TOS-CONFIG/tos_config.h:

一般来说不需要修改,使用官方提供的即可。我用的是 TencentOS-Demo 项目中的。
2. 加入针对 TOS 实现的线程和同步的函数。


  1. src/platforms/tos/mutex.c
  2. src/platforms/tos/semaphore.c
  3. src/platforms/tos/thread.c
  4. src/platforms/common/sys_tick.c
复制代码

3. 实现 rtos.c

主要就是 SysTick 中断的实现,从 TencentOS-Demo 中拷贝过来就行了。


  1. ret_t rtos_init(void) {
  2.   tos_knl_init();
  3.   tos_robin_config(TOS_ROBIN_STATE_ENABLED, (k_timeslice_t)500u);

  4.   return RET_OK;
  5. }

  6. ret_t rtos_start(void) {
  7.   tos_knl_start();

  8.   return RET_OK;
  9. }

  10. void rtos_tick(void) {
  11.   if (tos_knl_is_running()) {
  12.     tos_knl_irq_enter();
  13.     tos_tick_handler();
  14.     tos_knl_irq_leave();
  15.   }
  16. }

  17. void rtos_delay(uint32_t ms) {
  18.   tos_task_delay(ms);
  19. }
复制代码

4. 在线程中启动 AWTK


  1. void* awtk_thread(void* args) {
  2.   gui_app_start(320, 480);

  3.   return NULL;
  4. }

  5. static ret_t awtk_start_ui_thread(void) {
  6.   tk_thread_t* ui_thread = tk_thread_create(awtk_thread, NULL);
  7.   return_value_if_fail(ui_thread != NULL, RET_BAD_PARAMS);

  8.   tk_thread_set_priority(ui_thread, 3);
  9.   tk_thread_set_name(ui_thread, "awtk");
  10.   tk_thread_set_stack_size(ui_thread, 2048);

  11.   return tk_thread_start(ui_thread);
  12. }

  13. int main() {
  14.   hardware_prepare();
  15.   platform_prepare();

  16.   rtos_init();
  17.   awtk_start_ui_thread();
  18.   rtos_start();
  19.        
  20.         return 0;
  21. }
复制代码

这里与裸系统不同的地方,主要有两个:

在线程中启动 AWTK。

要提前调用 platform_prepare,platform_prepare 负责初始化内存,放在 tk_init 中就有些晚,需要单独提出来调用。

为此 platform_prepare 函数做了防重复调用的处理。


  1. static bool_t s_inited = FALSE;
  2. static uint32_t s_heam_mem[4096];

  3. ret_t platform_prepare(void) {
  4.         if(!s_inited) {
  5.                 s_inited = TRUE;
  6.     tk_mem_init(s_heam_mem, sizeof(s_heam_mem));
  7.         }
  8.   return RET_OK;
  9. }
复制代码
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。