1、拷贝 example/smart_config 到 helloworld
2、修改 user_main.c
3、编译生成bin文件
4、将bin烧写入开发板
5、按 reset 键,观察串口输出
/******************************************************************************
* FunctionName : ATaskHelloWord
* Description : hello word 任务
* Parameters : none
* Returns : none
*******************************************************************************/
void ATaskHelloWord( void *pvParameters )
{
for( ;; )
{
printf("Hello Word!\n");
vTaskDelay(100);
}
vTaskDelete( NULL );
}
/******************************************************************************
* FunctionName : user_init
* Description : entry of user application, init user function here
* Parameters : none
* Returns : none
*******************************************************************************/
void ICACHE_FLASH_ATTR
user_init(void)
{
printf("SDK version:%s\n", system_get_sdk_version());
xTaskCreate(ATaskHelloWord, "helloword_task", 256, NULL, 2, NULL);
}
任务创建
头文件:task.h
portBASE_TYPE xTaskCreate (
pdTASK_CODE pvTaskCode, 指向任务的实现函数的指针。效果上仅仅是函数名
const portCHAR * const pcNane, 具有描述性的任务名。FreeRTOS 不会使用它。
unsigned portSHORT usStackDepth, 指定任务堆栈的大小
void *pvParameters, 指针用于作为一个参数传向创建的任务
unsigned portBASE_TYPE uxPriority, 任务运行时的优先级
xTaskHandle *pvCreatedTask 用于传递任务的句柄,可以引用从而对任务进行其他操作。
)
任务延时
头文件:task.h
void vTaskDelay (
portTickType xTicksToDelay 时间数量,调用任务应该锁住的时间片周期
)
void vTaskDelayUntil (
portTickType *pxPreviousWakeTime, 指定一个变量来掌握任务最后开启的时间,第一次使用时必须使用当前时间来初始化, 在 vTaskDelayUntil 中,这个变量是自动修改的
portTickType xTimeIncrement 循环周期时间
)
任务删除
头文件:task.h
void vTaskDelete (
xTaskHandle pxTask 处理要删除的任务。传递 NULL 将删除自己
)
任务实现
void ATaskFunction( void *pvParameters )
{
/*可以像普通函数一样定义变量。用这个函数创建的每个任务实例都有一个属于自己的iVarialbleExample变量。但如果iVariableExample被定义为static,这一点则不成立——这种情况下只存在一个变量,所有的任务实例将会共享这个变量。*/
int iVariableExample = 0;
/* 任务通常实现在一个死循环中。 */
for( ;; ) {
/* 完成任务功能的代码将放在这里。 */
}
/*如果任务的具体实现会跳出上面的死循环,则此任务必须在函数运行完之前删除。传入NULL参数表示删除的是当前任务 */
vTaskDelete( NULL );
}
任务优先级
头文件:task.h
unsigned portBASE_TYPE uxTaskPriorityGet (
xTaskHandle pxTask 需要处理的任务. 当传递 NULL 时,将返回调用该任务的优先级
)
void vTaskPrioritySet (
xTaskHandle pxTask , 需要设置优先级的任务。当传递 NULL,将设置调用任务的优先级
unsigned portBASE_TYPE uxNewPriority 任务需要设置的优先级
)
任务挂起
头文件:task.h
void vTaskSuspend (
xTaskHandle pxTaskToSuspend 处理需要挂起的任务。传递 NULL 将挂起调用此函数的任务
)
void vTaskResume (
xTaskHandle pxTaskToResume 就绪任务的句柄
)
使用 freeRTOS 新建一个任务,使 nodeMCU 板上 LED 灯,1s 闪烁一次。
原理图分析
由原理图分析 LED1 连接在 GPIO16 上,低电平点亮,高电平关闭。
代码实现
在 user_main.c 下,添加:
在 user_init 下:
/******************************************************************************
* FunctionName : Led_init
* Description : init led conf
* Parameters : none
* Returns : none
*******************************************************************************/
void Led_init()
{
// 配置 GPIO16 为输出模式
gpio16_output_conf();
gpio16_output_set(1);
}
/******************************************************************************
* FunctionName : ATaskLed
* Description : led blink 任务
* Parameters : none
* Returns : none
*******************************************************************************/
void ATaskLed( void *pvParameters )
{
Led_init();
for( ;; )
{
gpio16_output_set(0);
vTaskDelay(100);
gpio16_output_set(1);
vTaskDelay(100);
}
vTaskDelete( NULL );
}