[ WiFi 智能家居项目 ] [ 4 ] ESP8266 编程

Hello World

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 就绪任务的句柄
)


LED

使用 freeRTOS 新建一个任务,使 nodeMCU 板上 LED 灯,1s 闪烁一次。

原理图分析

image.png

由原理图分析 LED1 连接在 GPIO16 上,低电平点亮,高电平关闭。

代码实现

在 user_main.c 下,添加:

  • Led 初始化
  • Led 任务

在 user_init 下:

  • 使用 led 初始化
  • 新建 led 任务
/******************************************************************************
 * 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 ); 
}