目录
一、GD32基础工程创建:
1、创建如下文件夹
2、在keil5创建工程
3、在工程添加相关.c文件和头文件路径
4、实例:实现LED闪烁功能
二、在基础工程添加FreeRTOS:
1、FreeRTOS中的文件:
2、添加的源文件:
3、添加的头文件路径:
4、在main()函数中创建StartTask任务,用于创建其它任务:
5、在StartTask任务硬件初始化,并且创建其它任务:
6、SysTick_Handler 中断处理函数,主要涉及任务切换:
三、FreeRTOS系统配置:
1、FreeRTOSConfig.h文件的宏
2、FreeRTOSConfig.h和FreeRTOS.h的区别:
一、GD32基础工程创建:
1、创建如下文件夹
(1) CMSIS中的文件:
(2) FwLibrary中的文件:
(3) USER中的文件:
2、在keil5创建工程
输入工程名和选择工程存放路径:
选择芯片型号:
3、在工程添加相关.c文件和头文件路径
4、实例:实现LED闪烁功能
(1) main.c实现硬件初始化,并且调用App相关功能实现具体业务:
(2) LedApp.c 调用led.c,实现闪烁这个模块的功能:
(3) led.c 为最底层硬件实现,被App层调用:
(4) 注意:添加了 systick初始化之后,要编写其对应的中断处理函数SysTick_Handler,否则程序无法正常运行:
二、在基础工程添加FreeRTOS:
1、FreeRTOS中的文件:
2、添加的源文件:
3、添加的头文件路径:
4、在main()函数中创建StartTask任务,用于创建其它任务:
5、在StartTask任务硬件初始化,并且创建其它任务:
Mian_Srever_Task任务的实现:
LED_Server_Task任务的实现:
6、SysTick_Handler 中断处理函数,主要涉及任务切换:
注意systick的初始化和SysTick_Handler中断函数的处理。
三、FreeRTOS系统配置:
1、FreeRTOSConfig.h文件的宏
(1) 作用:“config”开始的宏和“INCLUDE_”开始的宏一样,都是用来完成 FreeRTOS 的配置和裁剪的。
(2) 常用宏的配置:
①configUSE_PREEMPTION
configUSE_PREEMPTION=1时FreeRTOS系统为抢占式内核,configUSE_PREEMPTION=0时,使用协程内核。协程内核可以节省开销,但是功能有限。协程内核主要是针对以前性能较低的MCU使用的,但现在的MCU功能都比较强,所以不需要使用协程内核。
②configCPU_CLOCK_HZ
设置CPU频率,一般来说配置为和MCU相同的主频。
③configTICK_RATE_HZ
设置系统时钟节拍频率,该频率就是滴答定时器的中断频率,该中断频率最小单位为1us。不过一般是1000us,即1ms。
④configMAX_PRIORITIES
可使用的最大优先级数量,设置完成以后就可以设置任务优先级,但必须在0~(configMAX_PRIORITIES-1)区间内,其中0为最低优先级,configMAX_PRIORITIES-1为最高优先级。一般来说,最低优先级只分配给空闲任务,最高优先级只分配给软件定时器,所以实际可供用户使用的优先级数量为configMAX_PRIORITIES-2。数值越大,优先级越高。
注意:FreeRTOS 任务优先级共有 256 级,如果优先级大于最大优先级那就为最大优先级,一般不要改大优先级会占用内存。
⑤6configMINIMAL_STACK_SIZE
空闲任务使用的堆栈大小,要注意这个大小的单位不一定是1byte,比如说stm32是32位单片机,那么大小的单位就是4byte,当configMINIMAL_STACK_SIZE=100时,就相当于空闲任务堆栈大小为400byte。
⑥configMAX_TASK_NAME_LEN
任务名字符串长度,用户根据自己需要设定。
⑦configUSE_16_BIT_TICKS
系统节拍计数器变量数据类型,根据自己使用的是多少位的单片机来做修改,stm32是32位MCU,所以选择32位。下图是其定义:
从中可以看到,当configUSE_16_BIT_TICKS=1时,定义系统节拍计数器变量类型为16位,否则为32位。
⑧configIDLE_SHOULD_YIELD
选择空闲任务是否放弃CPU使用权给其他同优先级的用户任务,configIDLE_SHOULD_YIELD=1,让出CPU使用权给其他同级任务;否则不会让出。一般来说我们会置一。因为如果不使能的话,可能会导致有些用户任务运行的时间变少。
⑨configUSE_MUTEXES
configUSE_MUTEXES=1时,使用互斥信号量。相关函数将会被编译。
⑩configUSE_RECURSIVE_MUTEXES
configUSE_RECURSIVE_MUTEXES=1,使用互斥递归信号量,相关函数将会被编译。
⑪configUSE_COUNTING_SEMAPHORES
configUSE_COUNTING_SEMAPHORES=1,启用计数型信号量,相关函数会被编译。
⑫configQUEUE_REGISTRY_SIZE
configQUEUE_REGISTRY_SIZE = 1,启用队列记录,用以记录队列和信号量的最大数量,在使用内核调试器的时候可以查看该记录。
⑬configUSE_QUEUE_SETS
用于设置是否启动队列,为1启动。
⑭configUSE_TIME_SLICING(定义在FreeRTOS.h文件)
基于时间片的抢占式调度:
configUSE_PREEMPTION=1
configUSE_TIME_SLICING=1(默认为1)
当宏configUSE-TIME-SLICING定义为1的时候多个任务可以共用一个优先级,数量不限。此时处于就绪态的优先级相同的任务就会使用时间片轮转调度器获取运行时间。
2、FreeRTOSConfig.h和FreeRTOS.h的区别:
FreeRTOSConfig.h 是一个用户级别的配置文件,不属于内核文件。每个用户可以有不同的FreeRTOSConfig.h,从而实现不同的功能配置。
FreeRTOS.h是内核头文件,绝大多数配置选项都是根据宏值来对 FreeRTOS 进行配置的。
联系:FreeRTOS.h 通过检查 FreeRTOSConfig.h 用户级别的配置文件来实现对 FreeRTOS 的配置。这样,既实现了灵活配置,又保证了所有用户就只有 FreeRTOSConfig.h 不同,而不需要修改内核源码。
具体实现:FreeRTOS.h这个头文件,它会#include FreeRTOSConfig.h,并通过 #if 判断对应常量是否被定义,来决定是否启用对应的功能。