Free RTOS学习笔记3

1、信号量的使用

        首先介绍信号量与前面的队列的区别,队列传输的是信号和数据,信号量只是传输信号,在项目中不需要传输数据,只需要传输信号(比如唤醒信号)的时候,使用信号量是更简介、迅速的。下图是信号量和队列的区别的对比:

         信号量有两种形式,一种是二进制信号量(数据中只有0和1),另一种是计数型信号量(数值可以一直累加的),这两中形式可以按情况配置使用,下图是两者的区别图:

 这两者的创建函数分别为:

二进制信号量创建:xSemaphoreCreateBinary ()

计数型信号量创建:xSemaphoreCreateBinary ()

下面为静态创建去的函数:

xSemaphoreCreateBinaryStatic ()
xSemaphoreCreateCountingStatic ()
下面是信号量的删除函数:
/** xSemaphore: 信号量句柄,你要删除哪个信号量 */ 
void vSemaphoreDelete( SemaphoreHandle_t xSemaphore );

下面是信号量的give(传递信号),take(获得信号)的函数:

BaseType_t xSemaphoreGive( SemaphoreHandle_t xSemaphore );
xSemaphore 信号量句柄,释放哪个信号量
返回值
pdTRUE表示成功,
如果二进制信号量的计数值已经是1,再次调用此函数则返回失败;
如果计数型信号量的计数值已经是最大值,再次调用此函数则返回失败
BaseType_t xSemaphoreGiveFromISR( SemaphoreHandle_t xSemaphore, BaseType_t *pxHigherPriorityTaskWoken );
xSemaphore 信号量句柄,释放哪个信号量pxHigherPriorityTaskWoken
如果释放信号量导致更高优先级的任务变为了就绪态,
则*pxHigherPriorityTaskWoken = pdTRUE
返回值
pdTRUE表示成功,
如果二进制信号量的计数值已经是1,再次调用此函数则返回失败;
如果计数型信号量的计数值已经是最大值,再次调用此函数则返回失败
BaseType_t xSemaphoreTake( SemaphoreHandle_t xSemaphore, TickType_t xTicksToWait );
xSemaphore 信号量句柄,获取哪个信号量
xTicksToWait
如果无法马上获得信号量,阻塞一会:
0:不阻塞,马上返回
portMAX_DELAY: 一直阻塞直到成功
其他值: 阻塞的Tick个数,可以使用 pdMS_TO_TICKS() 来指定阻塞时间为若干
ms
返回值 pdTRUE表示成功
BaseType_t xSemaphoreTakeFromISR( SemaphoreHandle_t xSemaphore, BaseType_t *pxHigherPriorityTaskWoken );
xSemaphore 信号量句柄,获取哪个信号量
pxHigherPriorityTaskWoken
如果获取信号量导致更高优先级的任务变为了就绪态,
则*pxHigherPriorityTaskWoken = pdTRUE
返回值 pdTRUE表示成功

2、信号量的使用demo

        创建并使用了两个任务函数,task1和task2,task2的优先级大于task1的任务优先级,运行的顺序为:task2的任务优先级比较高,首先运行这个任务函数,运行到xSemaphoreTake(SemaphoreHandle,portMAX_DELAY);这个位置的时候,函数进入阻塞状态(因为等待的时间参数为portMAX_DELAY,死等),这时候task1开始运行,运行的过程中执行xSemaphoreGive(SemaphoreHandle);这行代码,就是向信号通道传输数据,会唤醒task2的任务函数的休眠阻塞状态,这时候task2就会开始运行,并且打断task1的运行。下面有debug的测试结果。

TaskHandle_t vCheckTask1_hander;
TaskHandle_t vCheckTask2_hander;
TaskHandle_t vCheckTask3_hander;

QueueHandle_t QueueUsart1;
QueueHandle_t QueueUsart2;
QueueSetHandle_t  xQueueUsartHandle;
QueueHandle_t SemaphoreHandle;


static void vCheckTask1( void *pvParameters )
{
	uint16_t data=1;
  for( ;; )
	{
//		xQueueSend(QueueUsart1,&data,portMAX_DELAY);
		printf("task1:%d\r\n",data);
		xSemaphoreGive(SemaphoreHandle);
//		vTaskDelay(10);
	}
}


static void vCheckTask2( void *pvParameters )
{
	uint16_t data=2;
  for( ;; )
	{
//		xQueueSend(QueueUsart2,&data,portMAX_DELAY);
		xSemaphoreTake(SemaphoreHandle,portMAX_DELAY);
		printf("task2:%d\r\n",data);
//		vTaskDelay(10);
	}
}

//static void vCheckTask3( void *pvParameters )
//{
//	uint16_t data;
//	QueueSetMemberHandle_t hander;
//  for( ;; )
//	{
		hander=xQueueSelectFromSet(xQueueUsartHandle,portMAX_DELAY);
		xQueueReceive(hander,&data,portMAX_DELAY);
//		printf("data:%d\r\n",data);
//		vTaskDelay(10);
//	}
//}


int main( void )
{
	prvSetupHardware();
	QueueUsart1=xQueueCreate(2,sizeof(uint16_t));
	QueueUsart2=xQueueCreate(2,sizeof(uint16_t));
	
	SemaphoreHandle=xSemaphoreCreateCounting(10,0);
	
	xQueueUsartHandle=xQueueCreateSet(3);
	xQueueAddToSet(QueueUsart1,xQueueUsartHandle);
	xQueueAddToSet(QueueUsart2,xQueueUsartHandle);
  xTaskCreate( vCheckTask1, "Check1", 100, NULL,1, &vCheckTask1_hander);
	xTaskCreate( vCheckTask2, "Check2", 100, NULL,2, &vCheckTask2_hander);
//	xTaskCreate( vCheckTask3, "Check3", 100, NULL,1, &vCheckTask3_hander);
	vTaskStartScheduler();
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TI RTOS学习笔记是作者在学习TI-RTOS过程中记录的学习笔记。根据引用[1],在学习TI-RTOS之前,先要了解什么是RTOS,以及什么是TI-RTOSRTOS是实时操作系统(Real-Time Operating System)的缩写,它是一种专门用于处理实时任务的操作系统。TI-RTOS是Texas Instruments(TI)公司提供的一种RTOS,适用于TI系列的处理器和微控制器。 根据引用,作者在网上没有找到TI-RTOS学习视频,但TI公司提供了许多相关的文档资料,因此作者选择通过阅读文档并记录笔记学习TI-RTOS。 另外,引用中提到了TI RTOS SDK编译框架的介绍。TI RTOS SDK是TI公司提供的用于开发TI-RTOS应用程序的软件开发工具包。编译框架是指用于将源代码转换为可执行文件的编译和构建过程。通过学习和了解TI RTOS SDK的编译框架,可以更好地理解和使用TI-RTOS。 所以,TI RTOS学习笔记是作者记录的关于学习TI-RTOS笔记,包括对RTOS的理解、TI-RTOS的介绍以及TI RTOS SDK的编译框架的学习和总结。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [TI-RTOS学习记录(一)——初识TI-RTOS](https://blog.csdn.net/qq_43105170/article/details/126447116)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [TI RTOS SDK编译框架介绍](https://download.csdn.net/download/embededman/86951678)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值