FreeRTOS学习笔记——互斥型信号量
来自:http://blog.csdn.net/xukai871105/article/details/43456985
0.前言
在嵌入式操作系统中互斥型信号量是任务间资源保护的重要手段。下面结合一个具体例子说明FreeRTOS中的互斥型信号量如何使用。
【相关博文】
1.基本说明
2.参考代码
- /* Standard includes. */
- #include <stdio.h>
- #include <string.h>
- /* Scheduler includes. */
- #include "FreeRTOS.h"
- #include "task.h"
- #include "queue.h"
- #include "semphr.h"
- /* Library includes. */
- #include "stm32f10x.h"
- #define LED0_ON() GPIO_SetBits(GPIOB,GPIO_Pin_5);
- #define LED0_OFF() GPIO_ResetBits(GPIOB,GPIO_Pin_5);
- static void Setup(void);
- void TaskA( void *pvParameters );
- void TaskB( void *pvParameters );
- void LedInit(void);
- void UART1Init(void);
- /* 互斥信号量句柄 */
- SemaphoreHandle_t xSemaphore = NULL;
- int main(void)
- {
- /* 初始化硬件平台 */
- Setup();
- /* 创建互斥信号量 */
- xSemaphore = xSemaphoreCreateMutex();
- /* 建立任务 */
- xTaskCreate( TaskA, "TaskA", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY+3, NULL );
- xTaskCreate( TaskB, "TaskB", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY+4, NULL );
- /* 启动OS */
- vTaskStartScheduler();
- return 0;
- }
- void TaskA( void *pvParameters )
- {
- for( ;; )
- {
- xSemaphoreTake( xSemaphore, portMAX_DELAY );
- {
- printf("Task A\r\n");
- }
- xSemaphoreGive( xSemaphore );
- vTaskDelay( 2000/portTICK_RATE_MS );
- }
- }
- void TaskB( void *pvParameters )
- {
- for( ;; )
- {
- xSemaphoreTake( xSemaphore, portMAX_DELAY );
- {
- printf("Task B\r\n");
- }
- xSemaphoreGive( xSemaphore );
- vTaskDelay( 1000/portTICK_RATE_MS );
- }
- }
- static void Setup( void )
- {
- LedInit();
- UART1Init();
- }
- void LedInit( void )
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE );
- /*LED0 @ GPIOB.5*/
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_Init( GPIOB, &GPIO_InitStructure );
- }
- void UART1Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- USART_InitTypeDef USART_InitStructure;
- /* 第1步:打开GPIO和USART时钟 */
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE);
- /* 第2步:将USART1 Tx@PA9的GPIO配置为推挽复用模式 */
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- /* 第3步:将USART1 Rx@PA10的GPIO配置为浮空输入模式 */
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- /* 第4步:配置USART1参数
- 波特率 = 9600
- 数据长度 = 8
- 停止位 = 1
- 校验位 = No
- 禁止硬件流控(即禁止RTS和CTS)
- 使能接收和发送
- */
- USART_InitStructure.USART_BaudRate = 9600;
- USART_InitStructure.USART_WordLength = USART_WordLength_8b;
- USART_InitStructure.USART_StopBits = USART_StopBits_1;
- USART_InitStructure.USART_Parity = USART_Parity_No;
- USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
- USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
- USART_Init(USART1, &USART_InitStructure);
- /* 第5步:使能 USART1, 配置完毕 */
- USART_Cmd(USART1, ENABLE);
- /* 清除发送完成标志 */
- USART_ClearFlag(USART1, USART_FLAG_TC);
- /* 使能USART1发送中断和接收中断,并设置优先级 */
- NVIC_InitTypeDef NVIC_InitStructure;
- // NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
- /* 设定USART1 中断优先级 */
- NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = configLIBRARY_KERNEL_INTERRUPT_PRIORITY;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- /* 使能接收中断 */
- // USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
- }
- int fputc(int ch, FILE *f)
- {
- /* 写一个字节到USART1 */
- USART_SendData(USART1, (uint8_t) ch);
- /* 等待发送结束 */
- while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)
- {}
- return ch;
- }
3.简单说明
xSemaphore = xSemaphoreCreateMutex();
xSemaphoreTake( xSemaphore, portMAX_DELAY ); //Take:拿资源
xSemaphoreGive( xSemaphore ); //Give:给出资源
4.总结
FreeRTOS学习笔记——互斥型信号量相关推荐
- 5.FreeRTOS学习笔记- 互斥量
基本概念 互斥量又称互斥信号量(本质是信号量),是一种特殊的二值信号量 互斥量 支持互斥量所有权.递归访问以及防止优先级翻转的特性,用于实现对临界资源(如显示器.打印机)的独占式访问. 任意时刻互斥量 ...
- freeRtos学习笔记 (7)信号量
freeRtos学习笔记 freeRtos信号量 信号量种类 信号量分为四种:二值信号量,互斥信号量,计数信号量和递归互斥信号量,其中计数信号量用于管理系统多个共享资源,用计数值表示可用资源数目;二值 ...
- FreeRTOS学习笔记
FreeRTOS学习笔记 (这是我自己学习FreeRTOS整理的笔记,仅供参考) 第一部分:实现FreeRTOS内核 变量名: 定义变量时往往会把变量的类型当作前缀加在变量上 变量类型 前缀 char ...
- 1、野火freertos学习笔记
野火freertos学习笔记 1.任务 1.1 栈 1.2 任务的切换 taskYIELD(); 1.3 临界段 2.空闲任务 3.任务优先级 4.任务延时的表现 5.时间片 5.1抢占式.协做式 6 ...
- FreeRtos学习笔记(11)查找就绪任务中优先级最高任务原理刨析
FreeRtos学习笔记(11)查找就绪任务中优先级最高任务原理刨析 怎么查找就绪任务中优先级最高的? tasks.c中声明了一个全局变量 uxTopReadyPriority,任务从其他状态进入就绪 ...
- freeRtos学习笔记 (8) 任务通知
freeRtos学习笔记 freeRtos任务通知 任务通知的优缺点 freeRtos任务控制块中包含两个32位的变量,用于任务通知,在一些情况下,任务通知可以替代信号量和事件组,并且比信号量和事件组 ...
- freeRtos学习笔记 (5)事件组
freeRtos学习笔记 freeRtos事件组 为什么要用事件组? 多任务环境下, 任务.中断之间往往需要同步操作,一个事件发生会告知等待中的任 务,即形成一个任务与任务.中断与任务间的同步.事件可 ...
- FreeRTOS学习笔记20200526
FreeRTOS学习笔记-Day1-20200526 nFlag = TRUE; 先立个Flag,是时候点亮嵌入式实时操作系统这个技能了.座右铭:坚持.认真.沉静.笃行. FreeRTOS优势 总结F ...
- freeRtos学习笔记 (9) 移植和CPU利用率统计
freeRtos学习笔记 (9) 移植和CPU利用率统计 使用官方固件移植 首先准备一个能跑的裸机工程 注意,freertos需要使用systick定时器,而stm32HAL库默认使用systick作 ...
最新文章
- 几经沉浮,人工智能前路何方?
- php修改新闻分类代码,新闻分类录入、显示系统_php
- 递归算法学习系列之八皇后问题
- linux怎么安装python包_linux下安装python软件包pymssql
- Android典型界面设计(3)——访网易新闻实现双导航tab切换
- honeywell新风系统控制面板说明_如何选择新风系统中的新风设备万家舒适家
- [react] React的isMounted有什么作用?
- JavaScript中九九乘法表制作
- java矩阵类_151-矩阵类
- C#实现DataTable按天分组并计数
- Linux 服务器安全加固 10条建议
- PASCAL VOC2012数据集介绍
- MCU_segger-JLINK批处理脚本烧录工具-JFlash
- 惠普笔记本安装Linux 7及NVIDIA Quandro P600显卡驱动
- Codeforces 1013 A. Piles With Stones
- 七牛云php回调,回调通知_开发指南_对象存储 - 七牛开发者中心
- pion-example-webrtc-applications示例学习
- 电商平台快递物流解决方案
- html的细节优化,网站图片优化细节放送(seo技巧)
- HTTP协议漫谈 C#实现图(Graph) C#实现二叉查找树 浅谈进程同步和互斥的概念 C#实现平衡多路查找树(B树)...