(2/9) commInit();【NRF51822】【RTOS队列】(21日上午学习 队列 下午和晚上看完初始化函数)

目录

文章目录

前言

一、commInit();

二、队列(F4开发手册第13章节)

2.1队列简介

    2.1.1 数据存储:

2.2队列结构体

2.3队列创建

    2.3.1函数原型

    2.3.2函数解释(这里只对动态创建进行了学习)

2.4向队列发送消息

2.5队列上锁和解锁 prvLockQueue() 和 prvUnLockQueue

2.6从队列读取消息

总结


 




前言

  之前(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

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值