资讯详情

资讯详情

FreeRTos 正点原子 笔记(1):freertos 源文件结构,移植步骤,裁剪后的 103ZET6 的 FreeRTOSConfig . h;驱动中 delay、sys、usart 源文件的修改

1谢谢正点原子公布的课程文件结构2移植步骤添加配置文件到项目103ZET6 里的老师们配置好的 FreeRTOSConfig . h:#ifndefFREERTOS_CONFIG_H#defineFREERTOS_CONFIG_H/* 头文件 */#include./SYSTEM/sys/sys.h#include./SYSTEM/usart/usart.h#includestdint.hexternuint32_tSystemCoreClock;/* 基础配置项 */#defineconfigUSE_PREEMPTION1/* 1: 抢占式调度器, 0: 协程式调度器, 无默认需定义 */#defineconfigUSE_PORT_OPTIMISED_TASK_SELECTION1/* 1: 使用硬件计算下一个要运行的任务, 0: 使用软件算法计算下一个要运行的任务, 默认: 0 */#defineconfigUSE_TICKLESS_IDLE0/* 1: 使能tickless低功耗模式, 默认: 0 */#defineconfigCPU_CLOCK_HZSystemCoreClock/* 定义CPU主频, 单位: Hz, 无默认需定义 */#defineconfigSYSTICK_CLOCK_HZ(configCPU_CLOCK_HZ/8)/* 定义SysTick时钟频率当SysTick时钟频率与内核时钟频率不同时才可以定义, 单位: Hz, 默认: 不定义 */#defineconfigTICK_RATE_HZ1000/* 定义系统时钟节拍频率, 单位: Hz, 无默认需定义 */#defineconfigMAX_PRIORITIES32/* 定义最大优先级数, 最大优先级configMAX_PRIORITIES-1, 无默认需定义 */#defineconfigMINIMAL_STACK_SIZE128*定义空闲任务的栈空间大小,单位:Word,无默认需定义*/*#defineconfigMAX_TASK_NAME_LEN16/* 定义任务名最大字符数, 默认: 16 */#defineconfigUSE_16_BIT_TICKS0/* 1: 定义系统时钟节拍计数器的数据类型为16位无符号数, 无默认需定义 */#defineconfigIDLE_SHOULD_YIELD1/* 1: 使能在抢占式调度下,同优先级的任务能抢占空闲任务, 默认: 1 */#defineconfigUSE_TASK_NOTIFICATIONS1/* 1: 使能任务间直接的消息传递,包括信号量、事件标志组和消息邮箱, 默认: 1 */#defineconfigTASK_NOTIFICATION_ARRAY_ENTRIES1/* 定义任务通知数组的大小, 默认: 1 */#defineconfigUSE_MUTEXES1/* 1: 使能互斥信号量, 默认: 0 */#defineconfigUSE_RECURSIVE_MUTEXES1/* 1: 使能递归互斥信号量, 默认: 0 */#defineconfigUSE_COUNTING_SEMAPHORES1/* 1: 使能计数信号量, 默认: 0 */#defineconfigUSE_ALTERNATIVE_API0/* 已弃用!!! */#defineconfigQUEUE_REGISTRY_SIZE8/* 定义可以注册的信号量和消息队列的个数, 默认: 0 */#defineconfigUSE_QUEUE_SETS1/* 1: 使能队列集, 默认: 0 */#defineconfigUSE_TIME_SLICING1/* 1: 使能时间片调度, 默认: 1 */#defineconfigUSE_NEWLIB_REENTRANT0/* 1: 任务创建时分配Newlib的重入结构体, 默认: 0 */#defineconfigENABLE_BACKWARD_COMPATIBILITY0/* 1: 使能兼容老版本, 默认: 1 */#defineconfigNUM_THREAD_LOCAL_STORAGE_POINTERS0/* 定义线程本地存储指针的个数, 默认: 0 */#defineconfigSTACK_DEPTH_TYPEuint16_t/* 定义任务堆栈深度的数据类型, 默认: uint16_t */#defineconfigMESSAGE_BUFFER_LENGTH_TYPEsize_t/* 定义消息缓冲区中消息长度的数据类型, 默认: size_t *//* 内存分配相关定义 */#defineconfigSUPPORT_STATIC_ALLOCATION0/* 1: 支持静态申请内存, 默认: 0 */#defineconfigSUPPORT_DYNAMIC_ALLOCATION1/* 1: 支持动态申请内存, 默认: 1 */#defineconfigTOTAL_HEAP_SIZE((size_t)(10*1024))/* FreeRTOS堆中可用的RAM总量, 单位: Byte, 无默认需定义 */#defineconfigAPPLICATION_ALLOCATED_HEAP0/* 1: 用户手动分配FreeRTOS内存堆(ucHeap), 默认: 0 */#defineconfigSTACK_ALLOCATION_FROM_SEPARATE_HEAP0/* 1: 用户自行实现任务创建时使用的内存申请与释放函数, 默认: 0 *//* 钩子函数相关定义 */#defineconfigUSE_IDLE_HOOK0/* 1: 使能空闲任务钩子函数, 无默认需定义 */#defineconfigUSE_TICK_HOOK0/* 1: 使能系统时钟节拍中断钩子函数, 无默认需定义 */#defineconfigCHECK_FOR_STACK_OVERFLOW0/* 1: 使能栈溢出检测方法1, 2: 使能栈溢出检测方法2, 默认: 0 */#defineconfigUSE_MALLOC_FAILED_HOOK0/* 1: 使能动态内存申请失败钩子函数, 默认: 0 */#defineconfigUSE_DAEMON_TASK_STARTUP_HOOK0/* 1: 使能定时器服务任务首次执行前的钩子函数, 默认: 0 *//* 运行时间和任务状态统计相关定义 */#defineconfigGENERATE_RUN_TIME_STATS0/* 1: 使能任务运行时间统计功能, 默认: 0 */#ifconfigGENERATE_RUN_TIME_STATS// 就在上面#include./BSP/TIMER/btim.h#defineportCONFIGURE_TIMER_FOR_RUN_TIME_STATS()ConfigureTimeForRunTimeStats()externuint32_tFreeRTOSRunTimeTicks;#defineportGET_RUN_TIME_COUNTER_VALUE()FreeRTOSRunTimeTicks#endif#defineconfigUSE_TRACE_FACILITY1/* 1: 使能可视化跟踪调试, 默认: 0 */#defineconfigUSE_STATS_FORMATTING_FUNCTIONS1/* 1: configUSE_TRACE_FACILITY为1时会编译vTaskList()和vTaskGetRunTimeStats()函数, 默认: 0 *//* 协程相关定义 */#defineconfigUSE_CO_ROUTINES0/* 1: 启用协程, 默认: 0 */#defineconfigMAX_CO_ROUTINE_PRIORITIES2/* 定义协程的最大优先级, 最大优先级configMAX_CO_ROUTINE_PRIORITIES-1, 无默认configUSE_CO_ROUTINES为1时需定义 *//* 软件定时器相关定义 */#defineconfigUSE_TIMERS1/* 1: 使能软件定时器, 默认: 0 */#defineconfigTIMER_TASK_PRIORITY(configMAX_PRIORITIES-1)/* 定义软件定时器任务的优先级, 无默认configUSE_TIMERS为1时需定义 */#defineconfigTIMER_QUEUE_LENGTH5/* 定义软件定时器命令队列的长度, 无默认configUSE_TIMERS为1时需定义 */#defineconfigTIMER_TASK_STACK_DEPTH(configMINIMAL_STACK_SIZE*2)/* 定义软件定时器任务的栈空间大小, 无默认configUSE_TIMERS为1时需定义 *//* 可选函数, 1: 使能 */#defineINCLUDE_vTaskPrioritySet1/* 设置任务优先级 */#defineINCLUDE_uxTaskPriorityGet1/* 获取任务优先级 */#defineINCLUDE_vTaskDelete1/* 删除任务 */#defineINCLUDE_vTaskSuspend1/* 挂起任务 */#defineINCLUDE_xResumeFromISR1/* 恢复在中断中挂起的任务 */#defineINCLUDE_vTaskDelayUntil1/* 任务绝对延时 */#defineINCLUDE_vTaskDelay1/* 任务延时 */#defineINCLUDE_xTaskGetSchedulerState1/* 获取任务调度器状态 */#defineINCLUDE_xTaskGetCurrentTaskHandle1/* 获取当前任务的任务句柄 */#defineINCLUDE_uxTaskGetStackHighWaterMark1/* 获取任务堆栈历史剩余最小值 */#defineINCLUDE_xTaskGetIdleTaskHandle1/* 获取空闲任务的任务句柄 */#defineINCLUDE_eTaskGetState1/* 获取任务状态 */#defineINCLUDE_xEventGroupSetBitFromISR1/* 在中断中设置事件标志位 */#defineINCLUDE_xTimerPendFunctionCall1/* 将函数的执行挂到定时器服务任务 */#defineINCLUDE_xTaskAbortDelay1/* 中断任务延时 */#defineINCLUDE_xTaskGetHandle1/* 通过任务名获取任务句柄 */#defineINCLUDE_xTaskResumeFromISR1/* 恢复在中断中挂起的任务 *//* 中断嵌套行为配置 */#ifdef__NVIC_PRIO_BITS#defineconfigPRIO_BITS__NVIC_PRIO_BITS#else#defineconfigPRIO_BITS4// 似乎是这一行有效#endif#defineconfigLIBRARY_LOWEST_INTERRUPT_PRIORITY15/* 中断最低优先级 */#defineconfigLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY5/* FreeRTOS可管理的最高中断优先级 */#defineconfigKERNEL_INTERRUPT_PRIORITY(configLIBRARY_LOWEST_INTERRUPT_PRIORITY(8-configPRIO_BITS))#defineconfigMAX_SYSCALL_INTERRUPT_PRIORITY(configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY(8-configPRIO_BITS))#defineconfigMAX_API_CALL_INTERRUPT_PRIORITYconfigMAX_SYSCALL_INTERRUPT_PRIORITY/* FreeRTOS中断服务函数相关定义 */#definexPortPendSVHandlerPendSV_Handler#definevPortSVCHandlerSVC_Handler/* 断言 */#definevAssertCalled(char,int)printf(Error: %s, %d\r\n,char,int)#defineconfigASSERT(x)if((x)0)vAssertCalled(__FILE__,__LINE__)/* FreeRTOS MPU 特殊定义 *///#define configINCLUDE_APPLICATION_DEFINED_PRIVILEGED_FUNCTIONS 0//#define configTOTAL_MPU_REGIONS 8//#define configTEX_S_C_B_FLASH 0x07UL//#define configTEX_S_C_B_SRAM 0x07UL//#define configENFORCE_SYSTEM_CALLS_FROM_KERNEL_ONLY 1//#define configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS 1/* ARMv8-M 安全侧端口相关定义。 *///#define secureconfigMAX_SECURE_CONTEXTS 5#endif/* FREERTOS_CONFIG_H */3驱动中 delay、sys、usart 源文件的修改4以下是 F103zet6 的 delay . c#include./SYSTEM/sys/sys.h#include./SYSTEM/delay/delay.hstaticuint16_tg_fac_us0;/* us延时倍乘数 *//* 如果SYS_SUPPORT_OS定义了,说明要支持OS了(不限于UCOS) */#ifSYS_SUPPORT_OS/* 添加公共头文件 (FreeRTOS 需要用到) */#includeFreeRTOS.h#includetask.hexternvoidxPortSysTickHandler(void);/** * brief systick中断服务函数,使用OS时用到 * param ticks: 延时的节拍数 * retval 无 */voidSysTick_Handler(void){HAL_IncTick();if(xTaskGetSchedulerState()!taskSCHEDULER_NOT_STARTED)xPortSysTickHandler();/* OS开始跑了,才执行正常的调度处理 */}#endif/** * brief 初始化延迟函数 * param sysclk: 系统时钟频率, 即CPU频率(HCLK) * retval 无 */voiddelay_init(uint16_tsysclk){#ifSYS_SUPPORT_OS/* 如果需要支持OS. */uint32_treload;#endifSysTick-CTRL0;/* 清Systick状态以便下一步重设如果这里开了中断会关闭其中断 */HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK_DIV8);/* SYSTICK使用内核时钟源8分频,因systick的计数器最大值只有2^24 */g_fac_ussysclk/8;/* 不论是否使用OS,g_fac_us都需要使用,作为1us的基础时基 */#ifSYS_SUPPORT_OS/* 如果需要支持OS. */reloadsysclk/8;/* 每秒钟的计数次数 单位为M */reload*1000000/configTICK_RATE_HZ;/* 根据delay_ostickspersec设定溢出时间reload为24位寄存器,最大值:16777216,在9M下,约合1.86s左右 */SysTick-CTRL|11;/* 开启SYSTICK中断 */SysTick-LOADreload;/* 每1/delay_ostickspersec秒中断一次 */SysTick-CTRL|10;/* 开启SYSTICK */#endif}#ifSYS_SUPPORT_OS/* 如果需要支持OS, 用以下代码 *//** * brief 延时nus * param nus: 要延时的us数. * note nus取值范围: 0 ~ 477218588(最大值即2^32 / g_fac_us g_fac_us 9) * retval 无 */voiddelay_us(uint32_tnus){uint32_tticks;uint32_ttold,tnow,tcnt0;uint32_treload;reloadSysTick-LOAD;/* LOAD的值 */ticksnus*g_fac_us;/* 需要的节拍数 */toldSysTick-VAL;/* 刚进入时的计数器值 */while(1){tnowSysTick-VAL;if(tnow!told){if(tnowtold)tcnttold-tnow;/* 这里注意一下SYSTICK是一个递减的计数器就可以了. */elsetcntreload-tnowtold;toldtnow;if(tcntticks)break;/* 时间超过/等于要延迟的时间,则退出. */}}}/** * brief 延时nms * param nms: 要延时的ms数 (0 nms 65535) * retval 无 */voiddelay_ms(uint16_tnms){uint32_ti;for(i0;inms;i)delay_us(1000);}#else/* 不使用OS时, 用以下代码 */#endif45**103c8t6 里的别的大师配置的 FreeRTOSConfig . h 所有的宏定义都是有效的 ** :#ifndefFREERTOS_CONFIG_H#defineFREERTOS_CONFIG_H#includesys.h#includeusart.h//针对不同的编译器调用不同的stdint.h文件#ifdefined(__ICCARM__)||defined(__CC_ARM)||defined(__GNUC__)#includestdint.hexternuint32_tSystemCoreClock;#endif//断言#definevAssertCalled(char,int)printf(Error:%s,%d\r\n,char,int)#defineconfigASSERT(x)if((x)0)vAssertCalled(__FILE__,__LINE__)/***************************************************************************************************************//* FreeRTOS基础配置配置选项 *//***************************************************************************************************************/#defineconfigUSE_PREEMPTION1//1 使用抢占式内核0 使用协程#defineconfigUSE_TIME_SLICING1//1 使能时间片调度(默认式使能的)#defineconfigUSE_PORT_OPTIMISED_TASK_SELECTION1//1 启用特殊方法来选择下一个要运行的任务//一般是硬件计算前导零指令如果所使用的 MCU 没有这些硬件指令的话此宏应该设置为 0#defineconfigUSE_TICKLESS_IDLE0// 1启用低功耗 tickless 模式#defineconfigUSE_QUEUE_SETS1//为 1 时启用队列#defineconfigCPU_CLOCK_HZ(SystemCoreClock)// CPU频率#defineconfigTICK_RATE_HZ(1000)//时钟节拍频率这里设置为 1000周期就是1ms#defineconfigMAX_PRIORITIES(32)//可使用的最大优先级#defineconfigMINIMAL_STACK_SIZE((unsignedshort)130)//空闲任务使用的堆栈大小#defineconfigMAX_TASK_NAME_LEN(16)//任务名字字符串长度#defineconfigUSE_16_BIT_TICKS0//系统节拍计数器变量数据类型//1表示为16位无符号整形0表示为32位无符号整形#defineconfigIDLE_SHOULD_YIELD1//为1时空闲任务放弃CPU使用权给其他同优先级的用户任务#defineconfigUSE_TASK_NOTIFICATIONS1//为1时开启任务通知功能默认开启#defineconfigUSE_MUTEXES1//为1时使用互斥信号量#defineconfigQUEUE_REGISTRY_SIZE8//不为0时表示启用队列记录具体的值是可以//记录的队列和信号量最大数目。#defineconfigCHECK_FOR_STACK_OVERFLOW0//大于0时启用堆栈溢出检测功能如果使用此功能//用户必须提供一个栈溢出钩子函数如果使用的话此值可以为1或者2因为有两种栈溢出检测方法。#defineconfigUSE_RECURSIVE_MUTEXES1//为1时使用递归互斥信号量#defineconfigUSE_MALLOC_FAILED_HOOK0//1使用内存申请失败钩子函数#defineconfigUSE_APPLICATION_TASK_TAG0#defineconfigUSE_COUNTING_SEMAPHORES1//为1时使用计数信号量/***************************************************************************************************************//* FreeRTOS与内存申请有关配置选项 *//***************************************************************************************************************/#defineconfigSUPPORT_STATIC_ALLOCATION1//支持静态内存申请#defineconfigSUPPORT_DYNAMIC_ALLOCATION1//支持动态内存申请#defineconfigTOTAL_HEAP_SIZE((size_t)(10*1024))//系统所有总的堆大小/***************************************************************************************************************//* FreeRTOS与钩子函数有关的配置选项 *//***************************************************************************************************************/#defineconfigUSE_IDLE_HOOK0//1使用空闲钩子0不使用#defineconfigUSE_TICK_HOOK0//1使用时间片钩子0不使用/***************************************************************************************************************//* FreeRTOS与运行时间和任务状态收集有关的配置选项 *//***************************************************************************************************************/#defineconfigGENERATE_RUN_TIME_STATS0//为1时启用运行时间统计功能#defineconfigUSE_TRACE_FACILITY1//为1启用可视化跟踪调试#defineconfigUSE_STATS_FORMATTING_FUNCTIONS1//与宏configUSE_TRACE_FACILITY同时为1时会编译下面3个函数//prvWriteNameToBuffer(), vTaskList(), vTaskGetRunTimeStats()/***************************************************************************************************************//* FreeRTOS与协程有关的配置选项 *//***************************************************************************************************************/#defineconfigUSE_CO_ROUTINES0//为1时启用协程启用协程以后必须添加文件croutine.c#defineconfigMAX_CO_ROUTINE_PRIORITIES(2)//协程的有效优先级数目/***************************************************************************************************************//* FreeRTOS与软件定时器有关的配置选项 *//***************************************************************************************************************/#defineconfigUSE_TIMERS1//为1时启用软件定时器#defineconfigTIMER_TASK_PRIORITY(configMAX_PRIORITIES-1)//软件定时器优先级#defineconfigTIMER_QUEUE_LENGTH5//软件定时器队列长度#defineconfigTIMER_TASK_STACK_DEPTH(configMINIMAL_STACK_SIZE*2)//软件定时器任务堆栈大小/***************************************************************************************************************//* FreeRTOS可选函数配置选项 *//***************************************************************************************************************/#defineINCLUDE_xTaskGetSchedulerState1#defineINCLUDE_vTaskPrioritySet1#defineINCLUDE_uxTaskPriorityGet1#defineINCLUDE_vTaskDelete1#defineINCLUDE_vTaskCleanUpResources1#defineINCLUDE_vTaskSuspend1//挂起任务#defineINCLUDE_vTaskDelayUntil1#defineINCLUDE_vTaskDelay1#defineINCLUDE_eTaskGetState1#defineINCLUDE_xTimerPendFunctionCall1/***************************************************************************************************************//* FreeRTOS与中断有关的配置选项 *//***************************************************************************************************************/#ifdef__NVIC_PRIO_BITS#defineconfigPRIO_BITS__NVIC_PRIO_BITS#else#defineconfigPRIO_BITS4#endif#defineconfigLIBRARY_LOWEST_INTERRUPT_PRIORITY15//中断最低优先级#defineconfigLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY5//系统可管理的最高中断优先级#defineconfigKERNEL_INTERRUPT_PRIORITY\(configLIBRARY_LOWEST_INTERRUPT_PRIORITY(8-configPRIO_BITS))#defineconfigMAX_SYSCALL_INTERRUPT_PRIORITY\(configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY(8-configPRIO_BITS))/***************************************************************************************************************//* FreeRTOS与中断服务函数有关的配置选项 *//***************************************************************************************************************/#definexPortPendSVHandlerPendSV_Handler#definevPortSVCHandlerSVC_Handler#endif/* FREERTOS_CONFIG_H */6谢谢
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →