百问网7天物联网记录(二)

FreeRTOSConfig.h参数理解

①调度算法

#define configUSE_PREEMPTION                    1 		//可抢占
#define configUSE_TIME_SLICING                  1		//时间片轮转
#define configIDLE_SHOULD_YIELD                 1  		//空闲任务让步

②时钟配置

#define configCPU_CLOCK_HZ                     (64000000) 
#define configTICK_RATE_HZ                      (1000) 
//#define configSYSTICK_CLOCK_HZ                  (8000000) 

其中configCPU_CLOCK_HZ是写入实际的CPU内核时钟频率,也就是CPU指令执行频率,在我这板子上是64Mhz(F103ZET6),因为我是用HSI倍频得来的,最高只有64Mhz。

configTICK_RATE_HZ是FreeRTOS系统自己的节拍中断的频率。即一秒中断的次数,每次中断FreeRTOS都会进行任务调度。这里设置为1000表示1ms中断一次。

configSYSTICK_CLOCK_HZ是滴答定时器时钟,一般来说这个默认是和configCPU_CLOCK_HZ相等的。所以在这将其注释。

③设置任务运行优先级

#define configMAX_PRIORITIES                    15

表示可用优先级为0~14,数值越高优先级越高。

空闲任务的优先级为0(taskIDLE_PRIORITY),因此它是最低优先级任务。

④设置内核中断优先级

#define configKERNEL_INTERRUPT_PRIORITY         255
#define configMAX_SYSCALL_INTERRUPT_PRIORITY    95
#define configMAX_API_CALL_INTERRUPT_PRIORITY   95

设置FreeRTOS内核的中断优先级(内核PendSV中断和SysTick中断使用的中断优先级),因为FreeRTOS内核中断(PendSV中断和SysTick中断)不允许抢占用户使用的中断(例如:用户的USART1中断,用户的SPI1中断),因此这个宏configKERNEL_INTERRUPT_PRIORITY一般定义为硬件最低优先级(例如:15)。

在cortex-m3内核,只使用了8位中的高四位[7:4]作为中断优先级,低四位无任何意义,一般填充1。

configKERNEL_INTERRUPT_PRIORITY=255,而255=1111 1111B,高4位的1111B=0x0F=15。所以,255就表示FreeRTOS内核的中断优先级号=15。

configMAX_SYSCALL_INTERRUPT_PRIORITY =95,95=0101 1111B,高4位的0101B=0x05=5。所以,95就表示可受FreeRTOS管控的起始中断优先级号=5。

其中configMAX_SYSCALL_INTERRUPT_PRIORITY不能设置为0,因为中断优先级号0是专门用于SVC中断启动任务使用的,内核启动中断vTaskStartScheduler()来调度任务。

这些内核中断优先级参数可参考 https://blog.csdn.net/ba_wang_mao/article/details/127301127

⑤配置堆栈内存

#define configSUPPORT_STATIC_ALLOCATION          	0 
#define configSUPPORT_DYNAMIC_ALLOCATION       	 	1 
#define configTOTAL_HEAP_SIZE                  		(1024*10) 
#define configAPPLICATION_ALLOCATED_HEAP        	0 
#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP 	1 
#define configMINIMAL_STACK_SIZE            		128 

其中configSUPPORT_STATIC_ALLOCATION表示使用静态分配内存,如果使能,还需要实现vApplicationGetIdleTaskMemory()和vApplicationGetTimerTaskMemory()函数。在这里设置动态内存分配。

configTOTAL_HEAP_SIZE表示用户为freertos申请的总的堆大小,工程项目中动态创建的每个任务都从这堆申请到栈区(称之为任务栈)后,该任务的形参、非静态局部变量以及函数调用信息都会使用这个栈区(称之为任务栈)进行入栈和出栈。所有任务的栈内存的总和不能超过该大小。这里设置为10k字节。

configAPPLICATION_ALLOCATED_HEAP表示让用户自己定义一个堆空间,让FreeRTOS从用户定义的堆空间中进行内存分配。如果使能,需要在应用程序的源文件中声明一个名为ucHeap的uint8_t数组,并由configTOTAL_HEAP_SIZE设置确定,如uint8_t ucHeap[configTOTAL_HEAP_SIZE]。

configMINIMAL_STACK_SIZE定义空闲任务使用的堆栈大小,是以字为单位的。在这里,栈大小为128表示栈内存占用128*4=512字节的空间。

⑥使能互斥量

#define configUSE_MUTEXES                       1 

⑦使能软件定时器

#define configUSE_TIMERS                         1

⑧weak内核中断服务函数

#define vPortSVCHandler 	    	SVC_Handler 
#define xPortPendSVHandler 	        PendSV_Handler 
#define xPortSysTickHandler 		SysTick_Handler 

在cortex-m3中,这三个内核中断会在freertos中重新实现,所以需要将stm32f1xx_it.c文件中的这三个中断服务函数用weak修饰,或者直接删去。

SysTick_Handler是滴答定时器的中断服务函数,此时freertos会重写SysTick_Handler并把滴答定时器作为时基源,但是本来HAL库的时基源是滴答定时器,所以需要另一个定时器作为HAL库的时基源。

当然,以上都是自己移植Freertos所需要关心和修改的宏定义。如果用CubeMX来配置,上面的基本不用修改,只要知道宏定义的意义是什么就可以了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值