AWTK移植STM32F767实践
文章目录
1. 资料下载
1.1 下载源码
源码官方仓库:码云awtk官方参库
AWTK移植STM32F767官方demo :官方移植demo
1.2 下载官方文档
以下几个文档是移植AWTK需要仔细阅读。
- AWTK开发实践pdf
- AWTK 硬件资源需求评估
- 嵌入式平台移植注意事项
- AWTK Designer快速使用指南.pdf (位于AWTK designer安装目录下)
1.3 安装awtk designer
官网下载地址:AWTK官网地址
2. 移植前硬件准备
移植AWTK前需确认LCD驱动正常,移植先自己简单测试下画线,画点是否正常。
3. 资源评估
- 官方移植demo资源
编译一下官方的移植demo,FALSH:993.07kB, 其实AWTK控件没有那么大,只是移植demo用的demo ui把很多的字库资源直接编译到FLASH,这导致编译出映像文件很大。这也是我刚移植是没注意遇到的一个问题。
- 屏蔽输入法,使用基本控件,AWTK编译FLASH约250K
4.工程建立
4.1 源码目录管理
源码目录里增加3个AWTK相关目录:
- AWTK: 用于存储WTK源码
进入AWTK目录,执行git clone命令从码云上下载awtk最新源码。
git clone https://gitee.com/yyf_sea/awtk - AWTK_PROT: 用于存储AWTK移植相关源码。
- AWTK_APP: 用于存储AWTK demo UI
4.2 keil工程管理
官方移植文档
参考官方移植文档,将相关的文件添加keil工程目录中。
4.3 keil工程配置
官方移植文档
参考官方文档:主要以下相要配置
1.如果要加载 png/jpg 图片格式 StackSize 不小于 32K。
2. 使用 keil 编译时,请在 C/C++ -> Misc Controls 中加上**–gnu **标志。
3. 如果系统有 FPU,初始化时一定要开启 FPU。
4. 在工程中定义宏 HAS_AWTK_CONFIG。
5 嵌入式系统移植
如果要使用自己的嵌入式系统,还需要移植一些系统资源。
下载的官方移植文档中已经移植有像RT-Tread系统,如果要移植其他系统,可参考该系统移植
5.1. 锁移植
AWTK提供了锁的接口,我们只要基于要移植的嵌入式系统实现相应接口即可。
接口名称 | 接口描述 |
---|---|
tk_mutex_t* tk_mutex_create() | 创建锁 |
ret_t tk_mutex_lock(tk_mutex_t* mutex) | 上锁 |
ret_t tk_mutex_unlock(tk_mutex_t* mutex) | 释放锁 |
ret_t tk_mutex_destroy(tk_mutex_t* mutex) | 销毁锁 |
我们将官方移植例程中:awtk\src\platforms\rtt\mutex.c拷贝到AWTK_PORT目录,然后修改实现相应接口。
以上锁接口为例:
ret_t tk_mutex_lock(tk_mutex_t* mutex) {
return_value_if_fail(mutex != NULL, RET_BAD_PARAMS);
os_lock(mutex->mutex);
return RET_OK;
}
5.2 信号量移植
AWTK提供了信号量的接口,我们只要基于要移植的嵌入式系统实现相应接口即可。
接口名称 | 接口描述 |
---|---|
tk_semaphore_t* tk_semaphore_create | 创建信号量 |
ret_t tk_semaphore_wait(tk_mutex_t* mutex) | 等待信号量 |
ret_t tk_semaphore_post(tk_mutex_t* mutex)发送信号量 | |
ret_t tk_semaphore_destroy(tk_mutex_t* mutex) | 销毁信号量 |
我们将官方移植例程中:awtk\src\platforms\rtt\semaphore.c拷贝到AWTK_PORT目录,然后修改实现相应接口。
以发送信号量接口为例:
ret_t tk_semaphore_post(tk_semaphore_t* semaphore) {
return_value_if_fail(semaphore != NULL, RET_BAD_PARAMS);
return_value_if_fail(os_sem_post(semaphore->sem) == OS_ERR_NONE, RET_FAIL);
return RET_OK;
}
5.3 进程移植
AWTK提供了进程的接口,我们只要基于要移植的嵌入式系统实现相应接口即可,以下为进程的主要接口
接口名称 | 接口描述 |
---|---|
tk_thread_t* tk_thread_create() | 创建任务 |
ret_t tk_thread_start(tk_thread_t* thread) | 启动任务 |
ret_t tk_thread_destroy(tk_thread_t* thread) | 删除任务 |
我们将官方移植例程中:awtk\src\platforms\rtt\semaphore.c拷贝到AWTK_PORT目录,然后修改实现相应接口。
5.4平台资源相关移植
- 时间节拍移植
uint64_t get_time_ms64() {
return HAL_GetTick();
}
- 休眠接口移植
void sleep_ms(uint32_t ms) {
delay_ms(ms);
}
- AWTK资源移植
AWTK需要使用到动态内存,我们可以基于AWTK本身提供的内存管理来做,我们只需要分配一段内存,然后AWTK的内存初始化接口初始化即可。
#define AWTK_MEM2_MAX_SIZE 2 * 1024 * 1024 //AWTK·ÖÅä2M¶¯Ì¬ÄÚ´æ¿Õ¼ä
#define AWTK_MEM2_ADDR (uint8_t*)0XC0400000
ret_t platform_prepare(void) {
tk_mem_init(AWTK_MEM2_ADDR, AWTK_MEM2_MAX_SIZE);
return RET_OK;
}
- 自定义内存管理
如果想使用自己的内存管理就必须实现AWTK的3个内存管理接口
接口名称 | 接口 |
---|---|
void* malloc(size_t size) | 分配内存 |
void* realloc(void* ptr, size_t size) | 重分配内存 |
void free(void* ptr) | 释放内存 |
void* calloc(size_t count, size_t size) | 分配内存 |
注意:realloc不能直接调用malloc来直接实现
6 AWTK Designer生成界面
6.1. 创建工程
6.2 创建demo ui
demo ui包括两个
6.3 裁剪字库
因为我们的demo仅有两个按钮,我们可以对字库进行裁剪,以减少demo ui占用的flash控件。
如图裁剪前有9460.61KB,裁剪后仅为14.4KB。
6.4 打包
- 将工程打包
- 将打包文件拷贝到keil工程目录
将awtk demo工程目录下的res目录和rc目录拷贝到keil工程的awtk-app目录下。 - 重新编译keil工程
注意:编译可能提示部分文件找不到,修改相关路径即可
7 awtk启动过程
7.1awtk初始化入口
我们在代码中调用gui_app_start()即可初始化并启动awtk demo
void GUI_task( void*arg )
{
gui_app_start(LCD_XSIZE, LCD_YSIZE);
while ( 1 )
{
GUI_msleep( 1 );
}
}
7.2 awtk初始化过程
8.鼓励作者
9.我的公众号
关注我的公众号,分享嵌入开发,android开发,linux运维的原创文章。