FreeRTOS信号量API函数基础教程

目录
  • 前言
  • 1创建二进制信号量
    • 1.1函数描述
  • 2创建计数信号量
    • 3创建互斥量
  • 4创建递归互斥量
  • 5删除信号量
  • 6获取信号量
  • 7获取信号量(带中断保护)
  • 8获取递归互斥量
  • 9释放信号量
  • 10释放信号量(带中断保护)
  • 11释放递归互斥量
  • 12获取互斥量持有任务的句柄

前言

FreeRTOS的信号量包括二进制信号量、计数信号量、互斥信号量(以后简称互斥量)和递归互斥信号量(以后简称递归互斥量)。我们可以把互斥量和递归互斥量看成特殊的信号量。

信号量API函数实际上都是宏,它使用现有的队列机制。这些宏定义在semphr.h文件中。如果使用信号量或者互斥量,需要包含semphr.h头文件。

二进制信号量、计数信号量和互斥量信号量的创建API函数是独立的,但是获取和释放API函数都是相同的;递归互斥信号量的创建、获取和释放API函数都是独立的。

1创建二进制信号量

1.1函数描述

SemaphoreHandle_t  xSemaphoreCreateBinary( void );

这个函数用于创建一个二进制信号量。二进制信号量要么有效要么无效,这也是为什么叫做二进制的原因。

新创建的信号量处于无效状态,这意味着使用API函数xSemaphoreTake()获取信号之前,需要先给出信号。

二进制信号量和互斥量非常相似,但也有细微的区别:互斥量具有优先级继承机制,二进制信号量没有这个机制。这使得二进制信号量更适合用于同步(任务之间或者任务和中断之间),互斥量更适合互锁。

一旦获得二进制信号量后不需要恢复,一个任务或中断不断的产生信号,而另一个任务不断的取走这个信号,通过这样的方式来实现同步。

低优先级任务拥有互斥量的时候,如果另一个高优先级任务也企图获取这个信号量,则低优先级任务的优先级会被临时提高,提高到和高优先级任务相同的优先级。这意味着互斥量必须要释放,否则高优先级任务将不能获取这个互斥量,并且那个拥有互斥量的低优先级任务也永远不会被剥夺,这就是操作系统中的优先级翻转。

互斥量和二进制信号量都是SemaphoreHandle_t类型,并且可以用于任何具有这类参数的API函数中。

1.2返回值

NULL:创建信号量失败,因为FreeRTOS堆栈不足。 其它值:信号量创建成功。这个返回值存储着信号量句柄。

1.3用法举例

SemaphoreHandle_t xSemaphore;
void vATask( void * pvParameters )
{
    /* 创建信号量 */
   xSemaphore = xSemaphoreCreateBinary();
   if( xSemaphore == NULL )
   {
       /* 因堆栈不足,信号量创建失败,这里进行失败处理*/
   }
   else
   {
       /* 信号量可以使用。信号量句柄存储在变量xSemahore中。
          如果在这里调用API函数xSemahoreTake()来获取信号量,
          则必然是失败的,因为创建的信号量初始是无效(空)的。*/
   }
}

2创建计数信号量

2.1函数描述

SemaphoreHandle_t xSemaphoreCreateCounting ( UBaseType_t uxMaxCount,
                                 UBaseType_t uxInitialCount )

创建计数信号量,计数信号量通常用于以下两种情况:

事件计数:在这种应用场合,每当事件发生,事件处理程序会“产生”一个信号量(信号量计数值会递增),每当处理任务处理事件,会取走一个信号量(信号量计数值会递减)。因此,事件发生或者事件被处理后,计数值是会变化的。

资源管理:在这种应用场合下,计数值表示有效资源的数目。为了获得资源,任务首先要获得一个信号量---递减信号量计数值。当计数值为0时,表示没有可用的资源。当占有资源的任务完成,它会释放这个资源,相应的信号量计数值会增一。计数值达到初始值(最大值)表示所有资源都可用。

2.2参数描述

uxMaxCount:最大计数值,当信号到达这个值后,就不再增长了。

uxInitialCount:创建信号量时的初始值。

2.3返回值

NULL表示信号量创建失败,否则返回信号量句柄。

2.4用法举例

void vATask( void * pvParameters )
 {
     xSemaphoreHandle xSemaphore;
     // 必须先创建信号量,才能使用它
     // 信号量可以计数的最大值为10,计数初始值为0.
     xSemaphore = xSemaphoreCreateCounting( 10, 0 );
     if( xSemaphore != NULL )
     {
         // 信号量创建成功
         // 现在可以使用信号量了。
     }
 }

3创建互斥量

3.1函数描述

SemaphoreHandle_t xSemaphoreCreateMutex( void )

创建互斥量。

可以使用API函数xSemaphoreTake()和xSemaphoreGive()访问互斥量,但是绝不可以用xSemaphoreTakeRecursive()和xSemaphoreGiveRecursive()访问。

二进制信号量和互斥量非常相似,但也有细微的区别:互斥量具有优先级继承机制,二进制信号量没有这个机制。这使得二进制信号量更适合用于同步(任务之间或者任务和中断之间),互斥量更适合互锁。

一旦获得二进制信号量后不需要恢复,一个任务或中断不断的产生信号,而另一个任务不断的取走这个信号,通过这样的方式来实现同步。

低优先级任务拥有互斥量的时候,如果另一个高优先级任务也企图获取这个信号量,则低优先级任务的优先级会被临时提高,提高到和高优先级任务相同的优先级。这意味着互斥量必须要释放,否则高优先级任务将不能获取这个互斥量,并且那个拥有互斥量的低优先级任务也永远不会被剥夺,这就是操作系统中的优先级翻转。

互斥量和二进制信号量都是SemaphoreHandle_t类型,并且可以用于任何具有这类参数的API函数中。

3.2返回值

NULL表示信号量创建失败,否则返回信号量句柄。

3.3用法举例

xSemaphoreHandle xSemaphore;
voidvATask( void * pvParameters )
{
    // 互斥量在未创建之前是不可用的
    xSemaphore = xSemaphoreCreateMutex();
    if( xSemaphore != NULL )
    {
        // 创建成功
        // 在这里可以使用这个互斥量了
    }
}

4创建递归互斥量

4.1函数描述

SemaphoreHandle_t xSemaphoreCreateRecursiveMutex( void )

用于创建递归互斥量。被创建的互斥量可以被API函数xSemaphoreTakeRecursive()和xSemaphoreGiveRecursive()使用,但不可以被API函数xSemaphoreTake()和xSemaphoreGive()使用。

递归类型的互斥量可以被拥有者重复获取。拥有互斥量的任务必须调用API函数xSemaphoreGiveRecursive()将拥有的递归互斥量全部释放后,该信号量才真正被释放。比如,一个任务成功获取同一个互斥量5次,那么这个任务要将这个互斥量释放5次之后,其它任务才能获取到它。

递归互斥量具有优先级继承机制,因此任务获得一次信号后必须在使用完后做一个释放操作。

互斥量类型信号不可以用在中断服务例程中。

4.2返回值

NULL表示互斥量创建失败,否则返回互斥量句柄。

4.3用法举例

xSemaphoreHandle xMutex;
void vATask( void * pvParameters )
{
    // 互斥量未创建前是不能被使用的
    xMutex = xSemaphoreCreateRecursiveMutex();
    if( xMutex != NULL )
    {
        // 创建成功
        // 在这里创建互斥量
    }
}

5删除信号量

5.1函数描述

void vSemaphoreDelete( SemaphoreHandle_t xSemaphore );

删除信号量。如果有任务阻塞在这个信号量上,则这个信号量不要删除。

5.2参数描述

xSemaphore:信号量句柄

6获取信号量

6.1函数描述

xSemaphoreTake(SemaphoreHandle_t xSemaphore, TickType_t xTicksToWait)

获取信号量。信号量必须是通过API函数xSemaphoreCreateBinary()、xSemaphoreCreateCounting()和xSemaphoreCreateMutex()预先创建过的。注意,递归互斥量类型信号量不能使用该函数、不用在中断服务程序中使用该函数。

6.2参数描述

xSemaphore:信号量句柄

xTickToWait:信号量无效时,任务最多等待的时间,单位是系统节拍周期个数。使用宏portTICK_PERIOD_MS可以辅助将系统节拍个数转化为实际时间(以毫秒为单位)。如果设置为0,表示不是设置等待时间。如果INCLUDE_vTaskSuspend设置为1,并且参数xTickToWait为portMAX_DELAY则可以无限等待。

6.3返回值

成功获取到信号量返回pdTRUE,否则返回pdFALSE。

6.4用法举例

SemaphoreHandle_t xSemaphore = NULL;
/*这个任务创建信号量 */
void vATask( void * pvParameters )
{
    /*创建互斥型信号量,用于保护共享资源。*/
    xSemaphore = xSemaphoreCreateMutex();
}
/* 这个任务使用信号量 */
void vAnotherTask( void * pvParameters )
{
    /* ... 做其它事情. */
    if( xSemaphore != NULL )
    {
        /*如果信号量无效,则最多等待10个系统节拍周期。*/
        if( xSemaphoreTake( xSemaphore, ( TickType_t ) 10 ) == pdTRUE )
        {
            /*到这里我们获取到信号量,现在可以访问共享资源了*/
            /* ... */
            /* 完成访问共享资源后,必须释放信号量*/
            xSemaphoreGive( xSemaphore );
        }
        else
        {
            /* 没有获取到信号量,这里处理异常情况。*/
        }
    }
}

7获取信号量(带中断保护)

7.1函数描述

xSemaphoreTakeFromISR(SemaphoreHandle_t xSemaphore,
                         signedBaseType_t *pxHigherPriorityTaskWoken)

API函数xSemaphoreTake()的另一版本,用于中断服务程序。

7.2参数描述

xSemaphore:信号量句柄

pxHigherPriorityTaskWoken:如果*pxHigherPriorityTaskWoken为pdTRUE,则需要在中断退出前手动进行一次上下文切换。从FreeRTOS V7.3.0开始,该参数为可选参数,并可以设置为NULL。

7.3返回值

信号量成功获取返回pdTRUE,否则返回pdFALSE。

8获取递归互斥量

8.1函数描述

xSemaphoreTakeRecursive(SemaphoreHandle_t xMutex, TickType_t xTicksToWait );

获取递归互斥信号量。互斥量必须是通过API函数xSemaphoreCreateRecursiveMutex()创建的类型。

文件FreeRTOSConfig.h中的宏configUSE_RECURSIVE_MUTEXES必须设置成1,此函数才有效。

已经获取递归互斥量的任务可以重复获取该递归互斥量。

使用xSemaphoreTakeRecursive() 函数成功获取几次递归互斥量,就要使用xSemaphoreGiveRecursive()函数返还几次,在此之前递归互斥量都处于无效状态。比如,某个任务成功获取5次递归互斥量,那么在它没有返还5次该递归互斥量之前,这个互斥量对别的任务无效。

8.2参数描述

xMutex:互斥量句柄,必须是使用API函数xSemaphoreCreateRecursiveMutex()返回的。

xTickToWait:互斥量无效时,任务最多等待的时间,单位是系统节拍周期个数。使用宏portTICK_PERIOD_MS可以辅助将系统节拍个数转化为实际时间(以毫秒为单位)。如果设置为0,表示不是设置等待时间。如果任务已经拥有信号量则xSemaphoreTakeRecursive()立即返回,不管xTickToWait是什么值。

8.3返回值

成功获取递归互斥量返回pdTURE,否则返回pdFALSE。

8.4用法举例

SemaphoreHandle_t xMutex = NULL;
// 这个任务创建互斥量
void vATask( void *pvParameters )
{
    // 这个互斥量用于保护共享资源
    xMutex =xSemaphoreCreateRecursiveMutex();
}
//这个任务使用互斥量
void vAnotherTask( void *pvParameters )
{
    // ... 做其它事情.
    if( xMutex != NULL )
    {
        // 如果互斥量无效,则最多等待10系统时钟节拍周期.
        if(xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 ) == pdTRUE )
        {
            // 到这里我们成功获取互斥量并可以访问共享资源了
            // ...
            // 由于某种原因,某些代码需要在一个任务中多次调用API函数
            // xSemaphoreTakeRecursive()。当然不会像本例中这样连续式
            //调用,实际代码会有更加复杂的结构
            xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 );
            xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 );
            // 我们获取一个互斥量三次,所以我们要将这个互斥量释放三次
            //它才会变得有效。再一次说明,实际代码可能会更加复杂。
            xSemaphoreGiveRecursive( xMutex );
            xSemaphoreGiveRecursive( xMutex );
            xSemaphoreGiveRecursive( xMutex );
            // 到这里,这个共享资源可以被其它任务使用了.
        }
        else
        {
            // 处理异常情况
        }
    }
}

9释放信号量

9.1函数描述

xSemaphoreGive(SemaphoreHandle_t xSemaphore )

用于释放一个信号量。信号量必须是API函数xSemaphoreCreateBinary()、xSemaphoreCreateCounting()或xSemaphoreCreateMutex() 创建的。必须使用API函数xSemaphoreTake()获取这个信号量。

这个函数绝不可以在中断服务例程中使用,可以使用带中断保护版本的API函数xSemaphoreGiveFromISR()来实现相同功能。

这个函数不能用于使用API函数xSemaphoreCreateRecursiveMutex()所创建的递归互斥量。

9.2参数描述

xSemaphore:信号量句柄。

9.3返回值

信号量释放成功返回pdTRUE,否则返回pdFALSE。

9.4用法举例

SemaphoreHandle_t xSemaphore = NULL;
voidvATask( void * pvParameters )
{
   // 创建一个互斥量,用来保护共享资源
   xSemaphore = xSemaphoreCreateMutex();

    if( xSemaphore != NULL )
    {
         if( xSemaphoreGive( xSemaphore ) != pdTRUE )
         {
              //我们希望这个函数调用失败,因为首先要获取互斥量
         }
         // 获取信号量,不等待
         if( xSemaphoreTake( xSemaphore, ( TickType_t ) 0 ) )
         {
              // 现在我们拥有互斥量,可以安全的访问共享资源
              if( xSemaphoreGive( xSemaphore ) != pdTRUE )
              {
                   //我们不希望这个函数调用失败,因为我们必须
                   //要释放已获取的互斥量
              }
         }
     }
}

10释放信号量(带中断保护)

10.1函数描述

xSemaphoreGiveFromISR(SemaphoreHandle_t xSemaphore,
                         signed BaseType_t *pxHigherPriorityTaskWoken )

释放信号量。是API函数xSemaphoreGive()的另个版本,用于中断服务程序。信号量必须是通过API函数xSemaphoreCreateBinary()或xSemaphoreCreateCounting()创建的。这里没有互斥量,是因为互斥量不可以用在中断服务程序中。

10.2参数描述

xSemaphore:信号量句柄

pxHigherPriorityTaskWoken:如果*pxHigherPriorityTaskWoken为pdTRUE,则需要在中断退出前人为的经行一次上下文切换。从FreeRTOS V7.3.0开始,该参数为可选参数,并可以设置为NULL。

10.3返回值

成功释放信号量返回pdTURE,否则返回errQUEUE_FULL。

10.4用法举例

#define LONG_TIME 0xffff
#define TICKS_TO_WAIT    10
SemaphoreHandle_t xSemaphore = NULL;
/* Repetitive task. */
void vATask( void * pvParameters )
{
    /* 我们使用信号量同步,所以先创建一个二进制信号量.必须确保
       在创建这个二进制信号量之前,中断不会访问它。*/
    xSemaphore = xSemaphoreCreateBinary();

    for( ;; )
    {
        /* 我们希望每产生10次定时器中断,任务运行一次。*/
        if( xSemaphoreTake( xSemaphore, LONG_TIME ) == pdTRUE )
        {
            /* 到这里成功获取到信号量*/
            ...
           /* 我们成功执行完一次,由于这是个死循环,所以任务仍会
               阻塞在等待信号量上。信号量由ISR释放。*/
        }
    }
}
/* 定时器 ISR */
void vTimerISR( void * pvParameters )
{
    static unsigned char ucLocalTickCount = 0;
    static signed BaseType_txHigherPriorityTaskWoken;
    /*定时器中断发生 */
      ...执行其它代码
    /*需要vATask() 运行吗? */
    xHigherPriorityTaskWoken = pdFALSE;
    ucLocalTickCount++;
    if( ucLocalTickCount >= TICKS_TO_WAIT )
    {
        /* 释放信号量,解除vATask任务阻塞状态 */
        xSemaphoreGiveFromISR( xSemaphore, &xHigherPriorityTaskWoken );
        /* 复位计数器 */
        ucLocalTickCount = 0;
    }
    /* 如果 xHigherPriorityTaskWoken 表达式为真,需要执行一次上下文切换*/
    portYIELD_FROM_ISR( xHigherPriorityTaskWoken );
}

11释放递归互斥量

11.1函数描述

xSemaphoreGiveRecursive(SemaphoreHandle_t xMutex )

释放一个递归互斥量。互斥量必须是使用 API函数xSemaphoreCreateRecursiveMutex()创建的。文件FreeRTOSConfig.h中宏configUSE_RECURSIVE_MUTEXES必须设置成1本函数才有效。

11.2参数描述

xMutex:互斥量句柄。必须是函数xSemaphoreCreateRecursiveMutex()返回的值。

11.3返回值

如果递归互斥量释放成功,返回pdTRUE。

11.4用法举例

见“8 获取递归互斥量”。

12获取互斥量持有任务的句柄

12.1函数描述

TaskHandle_t xSemaphoreGetMutexHolder( SemaphoreHandle_t xMutex );

返回互斥量持有任务的句柄(如果有的话),互斥量由参数xMutex指定。

如果调用此函数的任务持有互斥量,那么可以可靠的返回任务句柄,但是如果是别的任务持有互斥量,则不总可靠。

文件FreeRTOSConfig.h中宏configUSE_MUTEXES必须设置成1本函数才有效。

12.2参数描述

xMutex:互斥量句柄

12.3返回值

返回互斥量持有任务的句柄。如果参数xMutex不是互斥类型信号量或者虽然互斥量有效但这个互斥量不被任何任务持有则返回NULL。

这是FreeRTOS基础篇的最后一篇博文,到这里我们已经可以移植、熟练使用FreeRTOS了。但如果想知道FreeRTOS背后的运行机制,这些是远远不够的,下面要走的路还会很长。要不要了解FreeRTOS背后运行机制,全凭各位的兴趣,毕竟我们即使不清楚汽车的构造细节,但只要掌握驾驶技巧也可以很好的开车的。使用RTOS也与之相似,只要我们掌握了基础篇的那些知识,我们已经可以很好的使用FreeRTOS了。探索FreeRTOS背后运行的机制,可以让我们更优雅、更少犯错、更举重若轻的的使用RTOS。

FreeRTOS高级篇已经开始写了,可以点击这里查看最新的文章列表。

以上就是FreeRTOS信号量API函数基础教程的详细内容,更多关于FreeRTOS信号量API函数的资料请关注我们其它相关文章!

(0)

相关推荐

  • FreeRTOS实时操作系统之可视化追踪调试

    目录 前言 1.使能可视化追踪和运行时间统计功能 2.获取任务信息并格式化 3.添加到命令解释列表 前言 用RTOS编程,为每个任务分配多大的堆栈空间就成了一项技术活:分配多了浪费系统资源,分配少了又恐怕会发生堆栈溢出.由于中断和抢占式调度器的存在,我们要估算出一个任务需要多少堆栈是非常困难的,今天我们就介绍一种方法,来获取每个任务的剩余堆栈空间.本文以NXP LPC177x_8x系列微控制器为例. 我们将这个功能做成一个命令,添加到FreeRTOS使用任务通知实现命令行解释器一文介绍的命令解释

  • FreeRTOS任务控制API函数的功能分析

    目录 1.相对延时 1.1函数描述 1.2参数描述 1.3用法举例 2.绝对延时 2.1函数描述 2.2参数描述 2.3用法举例 3.获取任务优先级 3.1函数描述 3.2参数描述 3.3返回值 3.4用法举例 4.设置任务优先级 4.1函数描述 4.2参数描述 4.3用法举例 5.任务挂起 5.1函数描述 5.2参数描述 5.3用法举例 6.恢复挂起的任务 6.1函数描述 6.2参数描述 7.恢复挂起的任务(在中断服务函数中使用) 7.1函数描述 7.2参数描述 7.3返回值 7.4用法举例

  • FreeRTOS使用任务通知实现命令行解释器

    目录 前言 1.编码风格 2.一些准备工作 2.1串口硬件驱动 2.2一个类printf函数 3.使用任务通知 4.数据结构 4.1与命令有关的数据结构 4.2与分析命令有关数据结构 5.串口接收中断处理函数 6.命令行分析任务 6.1去除无效字符和控制字符 6.2参数分析 6.3定义命令回调函数 6.3.1不带参数的命令回调函数举例 6.3.2带参数的命令行回调函数举例 6.5命令行分析任务实现 7.使用的串口工具 7.1设置串口参数 7.2设置新行模式 7.3设置本地回显 8.测试 8.1无

  • FreeRTOS实时操作系统队列的API函数讲解

    目录 FreeRTOS为操作队列提供了非常丰富的API函数,包括队列的创建.删除,灵活的入队和出队方式.带中断保护的入队和出队等等.下面就来详细讲述这些API函数. 1.获取队列入队信息数目1.1函数描述 UBaseType_t uxQueueMessagesWaiting( QueueHandle_t xQueue ); 返回队列中存储的信息数目.具有中断保护的版本为uxQueueMessagesWaitingFromISR(),原型为:UBaseType_t uxQueueMessagesW

  • FreeRTOS实时操作系统的任务通知方法

    目录 前言 1.发送通知-方法1 1.1函数描述 1.2参数描述 1.3返回值 2.发送通知-方法2 2.1函数描述 2.2参数描述 2.3用法举例 3.获取通知 3.1函数描述 3.2参数描述 3.3返回值 4.等待通知 4.1函数描述 4.2参数描述 4.3返回值 4.4用法举例 5.任务通知并查询 5.1函数描述 5.2参数描述 5.3返回值 前言 注:本文介绍任务通知的基础知识,详细源码分析见FreeRTOS进阶<FreeRTOS高级篇8---FreeRTOS任务通知分析> 每个RTO

  • FreeRTOS实时操作系统队列基础

    目录 本文介绍队列的基本知识,详细源码分析见<FreeRTOS高级篇5---FreeRTOS队列分析> 1.FreeRTOS队列 队列是主要的任务间通讯方式.可以在任务与任务间.中断和任务间传送信息.大多数情况下,队列用于具有线程保护的FIFO(先进先出)缓冲区:新数据放在队列的后面.当然,数据也可以放在队列的前面,在下一篇讲队列API函数时,会涉及到数据的存放位置. 图1-1:读写队列 图1-1所示的队列中,最多能保存5个项目,并且假设队列永远不会满.任务A使用API函数xQueueSend

  • FreeRTOS信号量API函数基础教程

    目录 前言 1创建二进制信号量 1.1函数描述 2创建计数信号量 3创建互斥量 4创建递归互斥量 5删除信号量 6获取信号量 7获取信号量(带中断保护) 8获取递归互斥量 9释放信号量 10释放信号量(带中断保护) 11释放递归互斥量 12获取互斥量持有任务的句柄 前言 FreeRTOS的信号量包括二进制信号量.计数信号量.互斥信号量(以后简称互斥量)和递归互斥信号量(以后简称递归互斥量).我们可以把互斥量和递归互斥量看成特殊的信号量. 信号量API函数实际上都是宏,它使用现有的队列机制.这些宏

  • C语言函数基础教程分类自定义参数及调用示例详解

    目录 1.  函数是什么? 2.  C语言中函数的分类 2.1 库函数 2.1.1 为什么要有库函数 2.1.2 什么是库函数 2.1.3 主函数只能是main()吗 2.1.4常见的库函数 2.2 自定义函数 2.2.1自定义函数是什么 2.2.2为什么要有自定义函数 2.2.3函数的组成 2.2.4 举例展示 3. 函数的参数 3.1 实际参数(实参) 3.2  形式参数(形参) 4. 函数的调用 4.1 传值调用 4.2  传址调用 4.3 练习 4.3.1. 写一个函数判断一年是不是闰年

  • python基础教程之自定义函数介绍

    函数最重要的目的是方便我们重复使用相同的一段程序. 将一些操作隶属于一个函数,以后你想实现相同的操作的时候,只用调用函数名就可以,而不需要重复敲所有的语句. 函数的定义 首先,我们要定义一个函数, 以说明这个函数的功能. 复制代码 代码如下: def square_sum(a,b):     c = a**2 + b**2     return c 这个函数的功能是求两个数的平方和. 首先,def,这个关键字通知python:我在定义一个函数.square_sum是函数名. 括号中的a, b是函

  • Kotlin基础教程之函数定义与变量声明

    Kotlin基础教程之函数定义与变量声明 可以看到,函数定义就是 <访问控制符> <函数名> <参数列表> <:返回类型(不写就是无返回类型)> { 函数体 } 单语句函数可以简写,比如add函数和add1函数效果是一样的 变量定义 var <标识符> : <类型> = <初始化值> 常量定义 val <标识符> : <类型> = <初始化值> 常量与变量都可以没有初始化值,但是在引用前

  • Python基础教程之内置函数locals()和globals()用法分析

    本文实例讲述了Python基础教程之内置函数locals()和globals()用法.分享给大家供大家参考,具体如下: 1. 这两个函数主要提供,基于字典的访问局部变量和全局变量的方式. python 使用叫做名字空间的东西来记录变量的轨迹.名字空间是一个字典 ,它的键就是字符串形式的变量名字,它的值就是变量的实际值. 名字空间可以像 Python 的 dictionary 一样进行访问. 在一个 Python 程序中的任何一个地方,都存在几个可用的名字空间. 每个函数都有着自已的名字空间,叫做

  • C++ 基础教程之虚函数实例代码详解

    虚函数的定义 虚函数:就是在基类的成员函数前加关键字virtual(即被virtual关键字修饰的成员函数),并在一个或多个派生类中被重新定义的成员函数:虚函数:就是在编译的时候不确定要调用哪个函数,而是动态决定将要调用哪个函数.它的作用就是为了能让这个函数在它的子类里面可以被重载,这样的话,编译器就可以使用后期绑定来达到多态了,也就是用基类的指针来调用子类的这个函数:虚函数的作用:在于用专业术语来解释就是实现多态性,多态性是将接口与实现进行分离,通过指向派生类的基类指针或引用,访问派生类中同名

  • Vue API中setup ref reactive函数使用教程

    目录 1.setup 2.ref函数 3.reactive函数 4.Vue3.0中的响应式原理 5.reactive对比ref 1.setup 组件中所用到的:数据.方法等等,均要配置在setup中 setup函数的两种返回值: 若返回一个对象,则对象中的属性.方法, 在模板中均可以直接使用.(重点注意) 若返回一个渲染函数:则可以自定义渲染内容. 注意: vue2可以读取vue3里面的数据 如果 vue2和vue3冲突,会用vue3的,所以 尽量不要与Vue2.x配置混用 Vue2.x配置(d

  • FreeRTOS实时操作系统多任务管理基础知识

    目录 什么是多任务系统? FreeRTOS  任务与协程 1.任务(Task) 的特性 2.协程(Co-routine)的特性 任务状态 运行态 就绪态 阻塞态 挂起态 任务优先级 任务实现 任务控制块 任务堆栈 RTOS 系统的核心就是任务管理,FreeRTOS 也不例外,而且大多数学习 RTOS 系统的工程师或者学生主要就是为了使用 RTOS 的多任务处理功能,初步上手 RTOS 系统首先必须掌握的也是任务的创建.删除.挂起和恢复等操作,由此可见任务管理的重要性. 什么是多任务系统? 回想一

随机推荐