返回列表 发新帖我要提问本帖赏金: 50.00元(功能说明)

[活动] 极海APM32F411V Tiny开发板评测 嵌入式框架Zorb Framework移植

[复制链接]
 楼主| lemonhub 发表于 2024-5-22 10:06 | 显示全部楼层 |阅读模式
本帖最后由 lemonhub 于 2024-5-22 10:06 编辑

极海APM32F411V Tiny开发板评测07 嵌入式框架Zorb Framework移植 Zorb Framework
Zorb Framework是一个轻量级的嵌入式框架,搭建目的是为在不能运行Linux的芯片上快速开发应用,不用反复造轮子。
Zorb Framework的初步设计功能有
1、时间系统功能zf_time
2、环形缓冲区功能zf_buffer
3、列表功能zf_list
4、状态机功能zf_fsm
5、事件功能zf_event
6、定时器功能zf_timer
7、任务功能zf_task
前6个功能,就可以实现纯事件驱动的程序,基本可以满足中小型嵌入式应用程序开发的需求。加上任务功能,是为了满足部分程序对实时性要求较高的需求。当然,也可以将前6个功能裁剪出来,然后运行在现有的嵌入式系统上面,这样子也可以满足实时性的需求。
一、移植前的准备1. 准备目标硬件(开发板/芯片/模组)
Zorb Framework支持ARM Cortex M3/M4的内核的芯片的移植。本教程将使用立创开发板极海APM32F411V Tiny开发板进行示例移植,其他 ARM Cortex M3/M4系列开发板和芯片移植方法类似。
调试ARM Cortex M核还需要仿真器,如果您的开发板或者芯片模组没有板载仿真器,就需要连接外置的仿真器,如J-Link、DAPLink之类的。
apm32.jpg
2.准备编译器环境
本移植指南针对的是Keil编译器,所以我们移植内核前需要先安装Keil编译器,能编译ARM Cortex M核的Keil编译器现在也叫MDK。
下载地址为:https://www.keil.com/demo/eval/arm.htm
3. 准备芯片对应的裸机工程
移植Zorb Framework基础内核需要您提前准备一个芯片对应的裸机工程,裸机工程包含基本的芯片启动文件、基础配置(时钟、主频等)、以及串口1和systick,其中串口1提供调试打印功能,systick提供系统时间计数功能。
apm32-zf-01.jpg
apm32-zf-02.jpg

4. 准备Zorb Framework的源码
Zorb Framework的源码已经开源,github仓库地址 https://github.com/54zorb/Zorb-Framework
apm32-zf-00.jpg
apm32-zf-03.jpg
apm32-zf-04.jpg
apm32-zf-05.jpg
二、移植
打开keil工程,开始添加Zorb Framework的内核代码。
1. 添加Zorb Framework源代码文件
apm32-zf-06.jpg
2. 添加Zorb Framework头文件目录
apm32-zf-07.jpg
3. 系统滴答计数器 中断相关配置
  • 配置SysTick_Handler

apm32-zf-08.jpg
  • 配置SystemTick_init

apm32-zf-09.jpg
  • 初始化SystemTick_init 初始化系统时基

apm32-zf-10.jpg
  • 注释PendSV_Handler
    Zorb Framework提供的任务功能比较简单,状态也只有运行和关闭两种状态。任务功能实现的关键在于任务调度,而任务调度的核心又在于任务堆栈的保存和恢复。这部分需要根据使用的芯片进行修改,在APM32中,通过触发PendSV异常进行任务切换:
    Zorb Framework重写了endSV_Handler
    apm32-zf-11.jpg apm32-zf-12.jpg

这样Zorb Framework源码就全部添加完毕了。
三、测试移植结果1. 添加app_test测试代码
apm32-zf-13.jpg
2. 编写测试代码main.c
  1. /**
  2.   *****************************************************************************
  3.   * [url=home.php?mod=space&uid=288409]@file[/url]    main.c
  4.   * [url=home.php?mod=space&uid=187600]@author[/url]  CoderEnd
  5.   * [url=home.php?mod=space&uid=895143]@version[/url] V1.0.0
  6.   * [url=home.php?mod=space&uid=212281]@date[/url]    2024-05-21
  7.   * [url=home.php?mod=space&uid=247401]@brief[/url]   主程序的实现
  8.   *****************************************************************************
  9.   * @history
  10.   * 1.嵌入式框架Zorb Framework
  11.            https://www.cnblogs.com/54zorb/p/9277802.html
  12.   *****************************************************************************
  13. **/

  14. #include "main.h"
  15. #include "zf_includes.h"

  16. /******************************************************************************
  17. * 描述  :SystemTick初始化
  18. * 参数  :无
  19. * 返回  :无
  20. ******************************************************************************/
  21. void SystemTick_init(void)
  22. {
  23.     if (SysTick_Config(SystemCoreClock / 1000)) /* 1ms */
  24.     {
  25.         ZF_DEBUG(LOG_E, "systemtick init error\r\n");
  26.         while(1);
  27.     }
  28. }

  29. /**
  30.   * @brief  board_hardware_init
  31.   * @param  none
  32.   * @retval none
  33. **/
  34. static void board_hardware_init(void)
  35. {
  36.         SystemTick_init();                 //系统时基初始化
  37.         APM_LEDInit(LED2);          //LED2初始化
  38.         APM_LEDInit(LED3);                 //LED3初始化
  39.         USART1_Init(115200);        //UART1初始化
  40. }
  41. int main()
  42. {
  43.   board_hardware_init();
  44.         ZF_DEBUG(LOG_D,"Hardware_Init [ok] \r\n");
  45.   ZF_DEBUG(LOG_D,"apm32f411tiny board testing 2024-05-21 \r\n");
  46.   ZF_DEBUG(LOG_D,"gapm32f411tiny board zf-framework [ok]\r\n");
  47.   ZF_DEBUG(LOG_D, "init time used:%dms\r\n", ZF_SYSTIME_MS());
  48.   ZF_DEBUG(LOG_D, "zorb framework run\r\n");
  49.        
  50.         //测试 app_test 需要打开main.h 中的宏定义
  51.         #if USE_APP_BUFFER
  52.         App_Buffer_init();
  53.         App_Buffer_process();
  54.         #endif
  55.        
  56.         #if USE_APP_LIST
  57.         App_List_init();
  58.         App_List_process();
  59.         #endif
  60.        
  61.         #if USE_APP_FSM
  62.         App_Fsm_init();
  63.         App_Fsm_process();
  64.         #endif
  65.        
  66.         #if USE_APP_EVENT
  67.         App_Event_init();
  68.         App_Event_process();
  69.         #endif
  70.   
  71.         #if USE_APP_TIMER
  72.         App_Timer_init();
  73.         App_Timer_process();
  74.         #endif
  75.        
  76.         #if USE_APP_TASK
  77.         App_Task_init();
  78.         #endif
  79.        
  80.         while(1)
  81.         {
  82.                 APM_LEDOn(LED2);
  83.                 ZF_DELAY_MS(500);
  84.                 ZF_DEBUG(LOG_D, "init time used:%dms \r\n", ZF_SYSTIME_MS());
  85.           ZF_DEBUG(LOG_D, "drv_bsp_led2 on [ok] \r\n");
  86.     APM_LEDOff(LED2);
  87.                 ZF_DELAY_MS(500);
  88.                 ZF_DEBUG(LOG_D, "init time used:%dms \r\n", ZF_SYSTIME_MS());
  89.           ZF_DEBUG(LOG_D, "drv_bsp_led2 off [ok] \r\n");
  90.                 APM_LEDOn(LED3);
  91.                 ZF_DELAY_MS(1000);
  92.           ZF_DEBUG(LOG_D, "init time used:%dms \r\n", ZF_SYSTIME_MS());
  93.                 ZF_DEBUG(LOG_D, "drv_bsp_led3 on [ok] \r\n");
  94.     APM_LEDOff(LED3);
  95.                 ZF_DELAY_MS(1000);
  96.                 ZF_DEBUG(LOG_D, "init time used:%dms \r\n", ZF_SYSTIME_MS());
  97.                 ZF_DEBUG(LOG_D, "drv_bsp_led3 off [ok] \r\n");
  98.         }
  99.        
  100. }

main.h
  1. #ifndef __MAIN_H
  2. #define __MAIN_H



  3. //--------------------------------------------------------------------------------------------------
  4. //  C库函数调用头文件    |   0   |   1   |   2   |   3   |   4   |   5   |   6   |   7   |   8   |   9   
  5. //--------------------------------------------------------------------------------------------------
  6. #include <stdint.h>
  7. #include <stdbool.h>
  8. #include <string.h>
  9. #include <stdarg.h>
  10. #include <stdlib.h>  
  11. #include <stdio.h>   
  12. #include <math.h>
  13. //--------------------------------------------------------------------------------------------------
  14. //  数据类型重定义   |   0   |   1   |   2   |   3   |   4   |   5   |   6   |   7   |   8   |   9   
  15. //--------------------------------------------------------------------------------------------------
  16. /**************************************************************************************************
  17. typedef unsigned char               uint8_t;
  18. typedef unsigned short              uint16_t;
  19. typedef unsigned long               uint32_t;
  20. typedef unsigned long long int      uint64_t;

  21. typedef signed char                 int8_t;
  22. typedef signed short                int16_t;
  23. typedef signed long                 int32_t;
  24. typedef long long int               int64_t;

  25. C语言数据类型
  26. 整型(int)、单精度浮点型(float)
  27. 双精度浮点型(double)、字符型(char)

  28. 整型(int)类型又划分了
  29. long int(也可以直接写为long) 、long long int(可以直接写为long long) 、short int(可以直接写为short)
  30. 指针类型:void *;

  31. 空类型:void;

  32. 构造类型:数组、结构体(strtuct)、共用体类型(union)、枚举类型(enum);

  33. 1字节(Byte) = 8位(bit)   1Byte=8bi
  34. ******************************************************************************************************/
  35. //--------------------------------------------------------------------------------------------------
  36. // APM32库文件   |   0   |   1   |   2   |   3   |   4   |   5   |   6   |   7   |   8   |   9   
  37. //--------------------------------------------------------------------------------------------------
  38. #include "apm32f4xx.h"
  39. #include "apm32f4xx_int.h"
  40. #include "apm32f4xx_gpio.h"
  41. #include "apm32f4xx_rcm.h"
  42. #include "apm32f4xx_usart.h"
  43. //--------------------------------------------------------------------------------------------------
  44. //  中间件驱动文件   |   0   |   1   |   2   |   3   |   4   |   5   |   6   |   7   |   8   |   9   
  45. //--------------------------------------------------------------------------------------------------
  46. #include "log_printf.h"
  47. //--------------------------------------------------------------------------------------------------
  48. //  Drv_Drivers文件   |   0   |   1   |   2   |   3   |   4   |   5   |   6   |   7   |   8   |   9   
  49. //--------------------------------------------------------------------------------------------------

  50. //--------------------------------------------------------------------------------------------------
  51. //  BSP_Drivers文件   |   0   |   1   |   2   |   3   |   4   |   5   |   6   |   7   |   8   |   9   
  52. //--------------------------------------------------------------------------------------------------
  53. #include "bsp_delay.h"
  54. #include "bsp_led.h"
  55. #include "bsp_usart.h"


  56. //--------------------------------------------------------------------------------------------------
  57. //  自定义函数声明   |   0   |   1   |   2   |   3   |   4   |   5   |   6   |   7   |   8   |   9   
  58. //--------------------------------------------------------------------------------------------------
  59. #include "app_zf_buffer.h"
  60. #include "app_zf_list.h"
  61. #include "app_zf_fsm.h"
  62. #include "app_zf_event.h"
  63. #include "app_zf_timer.h"
  64. #include "app_zf_task.h"

  65. #define  USE_APP_BUFFER           0
  66. #define  USE_APP_LIST             0
  67. #define  USE_APP_FSM               0
  68. #define  USE_APP_EVENT             0
  69. #define  USE_APP_TIMER             0
  70. #define  USE_APP_TASK             0

  71. #endif





3. 编译下载观察效果
  • 测试时基释放正常输出(ZF_DEBUG,ZF_TIME)
    apm32-zf-14.jpg
  • 测试zf_buffer
    #define  USE_APP_BUFFER           1
    apm32-zf-15.jpg
  • 测试zf_list
    #define  USE_APP_LIST             1
    apm32-zf-16.jpg
  • 测试zf_fsm
    #define  USE_APP_FSM             1
    apm32-zf-17.jpg
  • 测试zf_event
    #define  USE_APP_EVENT             1
    apm32-zf-18.jpg
  • 测试zf_task
    #define  USE_APP_TASK             1
    apm32-zf-19.jpg
  • 测试zf_timer
    #define  USE_APP_TIMER             1
    事件和事件处理器已经设计好了,再把定时器的处理程序添加到系统滴答程序中即可:
    apm32-zf-20-1.jpg
    apm32-zf-20.jpg




打赏榜单

Gfan 打赏了 50.00 元 2024-07-17
理由:APM32F411V Tiny测评活动优质测评帖

szt1993 发表于 2024-5-23 16:58 | 显示全部楼层
嵌入式框架Zorb Framework有哪些具体的特点?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

80

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部