M0RTOS移植学习

FreeRTOSConfig.h

/*
 * FreeRTOS V202011.00
 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 *
 * http://www.FreeRTOS.org
 * http://aws.amazon.com/freertos
 *
 * 1 tab == 4 spaces!
 */


#ifndef FREERTOS_CONFIG_H
#define FREERTOS_CONFIG_H

/*-----------------------------------------------------------
 * Application specific definitions.
 *
 * These definitions should be adjusted for your particular hardware and
 * application requirements.
 *
 * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
 * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.
 *
 * See http://www.freertos.org/a00110.html
 *----------------------------------------------------------*/

/* Ensure stdint is only used by the compiler, and not the assembler. */
#include "e30f030xx.h"
#ifdef __ICCARM__
	#include <stdint.h>
	extern uint32_t SystemCoreClock;
#endif

#define configUSE_PREEMPTION			1   /* 为 1 时RTOS使用抢占式调度器  为 0 时RTOS使用协作式调度器(时间片) */
#define configUSE_IDLE_HOOK				0   /* 设置为1使用空闲钩子(类似于回调函数),0忽略空闲钩子。*/
#define configUSE_TICK_HOOK				0   /* 设置为1使用时间片钩子(Tick Hook),0忽略时间片钩子。 void vApplicationTickHook( void ); */
#define configCPU_CLOCK_HZ				( SystemCoreClock )	   /* 这个 必须 更改为自己芯片的实际频率 */
#define configTICK_RATE_HZ				( ( TickType_t ) 1000 )     /* RTOS 系统自己的节拍中断的频率。即一秒中断的次数,每次中断RTOS都会进行任务调度。 */
#define configMAX_PRIORITIES			( 5 )      /* 任务的最大优先级,根据需要修改*/
#define configMINIMAL_STACK_SIZE		( ( unsigned short ) 60 )  /* 定义空闲任务使用的堆栈大小。通常此值不应小于对应处理器演示例程文件FreeRTOSConfig.h中定义的数值。 */
#define configTOTAL_HEAP_SIZE			( ( size_t ) ( 6*1024 ) )      /* 为FreeRTOS分配的内存,具体和选择的heap_x.c相关 */
#define configMAX_TASK_NAME_LEN			( 5 ) /* 调用任务函数时,需要设置描述任务信息的字符串,这个宏用来定义该字符串的最大长度。 */
#define configUSE_TRACE_FACILITY		0 /* 设置成1表示启动可视化跟踪调试,会激活一些附加的结构体成员和函数。 */
#define configUSE_16_BIT_TICKS			0 /* 时间是以“ticks”来衡量的 - 这是自RTOS内核启动以来tick事件中断已执行的次数。将configUSE_16_BIT_TICKS定义为 1 会使TickType_t为无符号的16位类型定义(typedef’ed)。 将configUSE_16_BIT_TICKS定义为 0 会使TickType_t为无符号32位类型定义(typedef’ed)。 */
#define configIDLE_SHOULD_YIELD			1 /*     1使用抢占式内核调度  0用户任务使用空闲优先级。 */
#define configUSE_MUTEXES				1 /*  1  设置为 1 表示使用互斥量,设置成0表示忽略互斥量。读者应该了解在FreeRTOS中互斥量和二进制信号量的区别。 */
#define configQUEUE_REGISTRY_SIZE		8 /* 8 通过此定义来设置可以注册的信号量和消息队列个数。 */
#define configCHECK_FOR_STACK_OVERFLOW	0 /*  使用堆栈溢出检测方法 void vApplicationStackOverflowHook( TaskHandle_t xTask,char * pcTaskName ); */
#define configUSE_RECURSIVE_MUTEXES		1 /* 每个任务维护自己的栈空间, void vApplicationStackOverflowHook(TaskHandle_t xTask, signed char *pcTaskName );   */
#define configUSE_MALLOC_FAILED_HOOK	0 /* 如果宏configUSE_MALLOC_FAILED_HOOK设置为1  void vApplicationMallocFailedHook( void); */
#define configUSE_APPLICATION_TASK_TAG	0 /* 需要配置 configUSE_APPLICATION_TASK_TAG = 1 才能使用此函数 分配的标签只对应用程序有用,内核不使用 void vTaskSetApplicationTaskTag( TaskHandle_t xTask, TaskHookFunction_t pxHookFunction )  */
#define configUSE_COUNTING_SEMAPHORES	1 /*   */
#define configGENERATE_RUN_TIME_STATS	0 /*   */

/* Co-routine definitions. */
#define configUSE_CO_ROUTINES 			0 /*   */
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) /*   */

/* Software timer definitions. */
#define configUSE_TIMERS				1 /*   */
#define configTIMER_TASK_PRIORITY		( 2 ) /*   */
#define configTIMER_QUEUE_LENGTH		5 /*   */
#define configTIMER_TASK_STACK_DEPTH	( 80 ) /*   */

/* Set the following definitions to 1 to include the API function, or zero
to exclude the API function. */
#define INCLUDE_vTaskPrioritySet		1
#define INCLUDE_uxTaskPriorityGet		1
#define INCLUDE_vTaskDelete				1
#define INCLUDE_vTaskCleanUpResources	1
#define INCLUDE_vTaskSuspend			1
#define INCLUDE_vTaskDelayUntil			1
#define INCLUDE_vTaskDelay				1

/* Normal assert() semantics without relying on the provision of an assert.h
header file. */
#define configASSERT( x ) if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); for( ;; ); }

/* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS
standard names - or at least those used in the unmodified vector table. */
#define vPortSVCHandler SVC_Handler
#define xPortPendSVHandler PendSV_Handler
#define xPortSysTickHandler SysTick_Handler

#endif /* FREERTOS_CONFIG_H */


xTaskCreate() API 函数

portBASE_TYPE xTaskCreate( pdTASK_CODE pvTaskCode, 
						const signed portCHAR * const pcName,
						unsigned portSHORT usStackDepth,
						void *pvParameters,
						unsigned portBASE_TYPE uxPriority,
						xTaskHandle *pxCreatedTask 
						);

pvTaskCode:
任务只是永不退出的 C 函数,实现常通常是一个死循环。
参数pvTaskCode 只一个指向任务的实现函数的指针(效果上仅仅是函数名)。

pcName :
具有描述性的任务名。这个参数不会被 FreeRTOS 使用。其只是单纯地用于辅助调试。识别一个具有可读性的名字总是比通过句柄来识别容易得多。
应用程序可以通过定义常量 config_MAX_TASK_NAME_LEN 来定义任务名的最大长度——包括’\0’结束符。如果传入的字符串长度超过了这个最大值,字符串将会自动被截断。

usStackDepth:
当任务创建时,内核会分为每个任务分配属于任务自己的唯一状态。usStackDepth 值用于告诉内核为它分配多大的栈空间。这个值指定的是栈空间可以保存多少个字(word),而不是多少个字节(byte)。比如说,如果是 32 位宽的栈空间,传入的 usStackDepth值为 100,则将会分配 400 字节的栈空间(100 * 4bytes)。栈深度乘以栈宽度的结果千万不能超过一个 size_t 类型变量所能表达的最大值。
应用程序通过定义常量 configMINIMAL_STACK_SIZE 来决定空闲任务任用的栈空间大小。在 FreeRTOS 为微控制器架构提供的Demo 应用程序中,赋予此常量的值是对所有任务的最小建议值。如果你的任务会使用大量栈空间,那么你应当赋予一个更大的值。没有任何简单的方法可以决定一个任务到底需要多大的栈空间。计算出来虽然是可能的,但大多数用户会先简单地赋予一个自认为合理的值,然后利用 FreeRTOS 提供的特性来确证分配的空间既不欠缺也不浪费。第六章包括了一些信息,可以知道如何去查询任务使用了多少栈空间。

pvParameters :
任务函数接受一个指向 void 的指针(void*)。pvParameters 的值即是传递到任务中的值。这篇文档中的一些范例程序将会示范这个参数可以如何使用。

uxPriority :
指定任务执行的优先级。优先级的取值范围可以从最低优先级 0 到最高优先级(configMAX_PRIORITIES – 1)。
configMAX_PRIORITIES 是一个由用户定义的常量。优先级号并没有上限(除了受限于采用的数据类型和系统的有效内存空间),但最好使用实际需要的最小数值以避免内存浪费。如果 uxPriority 的值超过了(configMAX_PRIORITIES – 1),将会导致实际赋给任务的优先级被自动封顶到最大合法值。

pxCreatedTask pxCreatedTask 用于传出任务的句柄。这个句柄将在 API 调用中对该创建出来的任务进行引用,比如改变任务优先级,或者删除任务。如果应用程序中不会用到这个任务的句柄,则 pxCreatedTask 可以被设为 NULL。
返回值 有两个可能的返回值:

  1. pdTRUE
    表明任务创建成功。
  2. errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY
    由于内存堆空间不足,FreeRTOS 无法分配足够的空间来保存任务结构数据和任务栈,因此无法创建任务。第五章将提供更多有关内存管理方面的信息。

在这里插入图片描述
一套下来,内存已爆,再见。。。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值