目录
2.5队列上锁和解锁 prvLockQueue() 和 prvUnLockQueue
前言
之前(1/9)写成遥控器的led灯初始化了。
本文进行(2/9)NRF51822 通讯模块的初始化学习。
一、commInit();
void commInit(void)
{
if (isInit) return;
radiolinkInit(); /*无线通信初始化*/
usblinkInit(); /*USB通信初始化*/
isInit = true;
}
void radiolinkInit(void)
{
if (isInit) return;
//到这里疑惑了 为什么无线通讯扯上串口通讯了
//看了硬件资源才明白 NRF51822通过串口U2连接到MCU上 作机载通讯及电源检测设备
uartslkInit(); //这里不用进去看懂 就是串口初始化 明白是哪个串口 波特率 以及 GPIO即可
//主要是要看懂这个
//第一个参数是指队列能够包含的最大项目数 第二个是每个项目的字节数
//这里是 包含30个项目 每个项目atkp_t 是32个字节 ID + LENTH +DATA[30]
//暂未跟进函数体看如何判断是否创建成功 这里猜想就是分配一个空间用作串口队列通信 如果成功分配就是成功
//发现usb里面同样使用这个函数 可能这是队列相关 并不是串口初始化专用 白天学习一下
txQueue = xQueueCreate(RADIOLINK_TX_QUEUE_SIZE, sizeof(atkp_t)); //返回是否创建成功
ASSERT(txQueue);
isInit = true;
}
void usblinkInit()
{
if(isInit) return;
usbd_cdc_vcp_Init();
/*同 串口初始化 格式*/
txQueue = xQueueCreate(USBLINK_TX_QUEUE_SIZE, sizeof(atkp_t));
ASSERT(txQueue);
isInit = true;
}
1:55 宿舍
October 21, 2020
二、队列(F4开发手册第13章节)
没有操作系统的时候两个应用程序进行消息传递一般使用全局变量,但这会涉及到资源管理的问题。
RTOS提供了 “队列Queue”的机制来完成任务与任务、任务与中断之间的消息传递。
2.1队列简介
2.1.1 数据存储:
队列一般采用FIFO先进先出的存储缓冲机制,也可以采用LIFO后进先出的机制。
- 队列采用数据拷贝,而不是原数据的指针,但也可以将原数据的指针当作数据传入
- 队列可以多任务访问
- 出队阻塞和入队阻塞: 读数据(出队)为空/写数据(入队)为满,设定阻塞时间 0~portMAX_DELAY,就可以设置 扭头就走 稍微等等 死等三种方式
- 队列操作过程图示:
2.2队列结构体
2.3队列创建
2.3.1函数原型
一种是静态的 xQueueCreateStatic();一种是动态的 xQueueCreate();
这两个函数本质上都是宏,实际上是另外两个函数。
2.3.2函数解释(这里只对动态创建进行了学习)
- 函数xQueueCreate(uxQueueLength,uxItemsize)
这里的param1 是指项目数,也就是例子中的四格。
这里的param12是指每个项目的字节数,也就是每格占据几个字节。
- 函数xQueueGeneticCreate(uxQueueLength,uxItemsize)【主要是给队列分配内存】
对这个函数的解释: 传入了上述三个参数 函数内容是:
计算需要的内存空间 前两个参数的乘积 ,利用pvPortMalloc申请内存,如果申请成功就把地址给pxNewQueue
并返回 pxNewQueue
- 函数prvInitialiseNewQueue()
函数功能:用于队列的初始化,主要是将队列的属性存储在结构体当中
2.4向队列发送消息
RTOS提供了8个向队列发送消息的API函数
①三个任务级入队函数都是采用的一个函数 差别是 前向入队 后向入队 覆写入队
param1@xQueue :向哪个队列发送数据。
param2@pvItemToQueue:指向要发送的消息,是一个指针,发送的时候会将这个消息拷贝到队列当中
消息类型应该符合创建队列时的规定。
param3@xTicksToWait: 阻塞时间,入队时如果队列满了的最大等待时间,如果为portMAX_DELAY就会一直等待,但是宏 INCLUDE_vTaskSuspend必须为1。
如果阻塞时间不为0,会用到prvLockQueue prvUnLockQueue加入至任务等待列表中 锁定队列
vTaskSetTimeOutState xTaskCheckForTimeOut() 初始化和更新超市结构体变量
②三个中断级入队函数:没有阻塞时间(没有明白为什么),多了param@pxHigherPriorityTaskWoken用于标记退出此函数后是 否进行任务切换。
2.5队列上锁和解锁 prvLockQueue() 和 prvUnLockQueue
2.6从队列读取消息
总结
- xQueueCreate(Length,Size); 返回队列句柄 或者 NULL 创建失败
- xQueueSend(xQueue,pvItemToQueue,xTicksToWait); 返回pdPASS 或者 errQUEUE_FULL
- xQueueReceive(); 返回pdTRUE 或者 pdFALSE