当前位置: 首页 > wzjs >正文

成立网站要营业执照吗怎样才能申请网站

成立网站要营业执照吗,怎样才能申请网站,网站加入购物车的代码,wordpress kratos主题参考教程:【正点原子】手把手教你学UCOS-III实时操作系统_哔哩哔哩_bilibili 一、队列介绍 1、概述 (1)队列是任务到任务、中断到任务数据交流的一种机制,它不同于全局变量。假设有一个全局变量a,现有两个任务都在写…

参考教程:【正点原子】手把手教你学UCOS-III实时操作系统_哔哩哔哩_bilibili

一、队列介绍

1、概述

(1)队列是任务到任务、中断到任务数据交流的一种机制,它不同于全局变量。假设有一个全局变量a,现有两个任务都在写这个变量a,如下所示,变量自增分为三个步骤,如果在任务1读数据以后、修改数据以前发生任务切换,这将导致任务2和任务1读取相同的数据,并且基于相同的数据做相同的修改,这显然是有问题的,而使用队列可以避免这种问题(指访问冲突)。

(2)µC/OS-III基于队列实现了多种功能,并且读写队列做好了保护(主要依靠临界区),防止多任务同时访问冲突,用户只需要直接调用API函数即可。(中断不可以调用队列接收函数,但是可以调用队列发送函数)

2、µC/OS-III队列的特点

(1)数据入队出队方式:队列通常采用“先进先出”(FIFO)的数据存储缓冲机制,即先入队的数据会先从队列中被读取;µC/OS-III中也可以配置为“后进先出”(LIFO)方式。

(2)数据传递方式:µC/OS-III中的队列数据是一个“万能指针”(void*类型的指针),可以指向任何数据甚至是函数,所以发送方和接收方必须按照约定好的方式去发送和接收消息,这样才能正常解析接收到的消息。

(3)队列不属于某个任务,任何任务和中断都可以向队列发送消息,但是读取消息只能在任务中,不支持中断读取消息。

(4)当任务向一个队列读取消息时,可以指定一个阻塞时间。

        假设此时队列已空无法出队(出队阻塞):

        若阻塞时间为0,其它任务打算让数据出队时会死等(期间任务将会进入阻塞态),一直等到队列中有数据可以出队为止。

        若阻塞时间不为0,其它任务打算让数据出队时会等待设定的阻塞时间(期间任务将会进入阻塞态),若在该时间内还无数据可出队,超时后直接返回,不再等待。

(5)当任务向一个队列写入消息时,无论如何都不会引起阻塞。

二、队列相关API函数介绍

1、概述

(1)使用队列的主要流程:创建队列→写队列(发送消息到队列)→读队列(获取消息队列的数据)。

(2)队列相关API函数概览:

函数

描述

OSQCreate

创建一个消息队列

OSQDel

删除一个消息队列

OSQFlush

清空消息队列中的所有消息

OSQPend

获取消息队列中的消息

OSQPendAbort

终止任务挂起等待消息队列

OSQPost

发送消息到消息队列

2、函数定义概览

(1)OSQCreate函数定义:

void OSQCreate
(OS_Q* 			p_q,CPU_CHAR* 	p_name,OS_MSG_QTY 	max_qty,OS_ERR* 		p_err
) 

形参

描述

p_q 

指向消息队列结构体的指针

p_name 

指向作为消息队列名的 ASCII 字符串的指针

max_qty 

消息队列的大小

p_err 

指向接收错误代码变量的指针

(2)OSQPost函数定义:

void  OSQPost
(OS_Q*			p_q,void* 			p_void,OS_MSG_SIZE	msg_size,OS_OPT 		opt,OS_ERR* 		p_err
) 

形参

描述

p_q 

指向消息队列结构体的指针

p_void 

指向消息的指针

msg_size 

消息的大小,单位: 字节

opt 

OS_OPT_POST_FIFO :将发送的消息保存在队列的末尾
OS_OPT_POST_LIFO :将发送的消息保存在队列的开头
OS_OPT_POST_ALL :将消息发送给所有等待该消息的任务
OS_OPT_POST_NO_SCHED :禁止在本函数内执行任务调度
以上的几种类型可以进行组合

p_err 

指向接收错误代码变量的指针

(3)OSQPend函数定义:

void  OSQPost
(OS_Q*			p_q,void* 			p_void,OS_MSG_SIZE	msg_size,OS_OPT 		opt,OS_ERR* 		p_err
) 

形参

描述

p_q 

指向消息队列结构体的指针

timeout 

任务挂起等待消息队列的最大允许时间,当为0时,表示将一直等待,直到接收到消息

opt 

OS_OPT_PEND_BLOCKING:如无任何消息存在就阻塞任务OS_OPT_PEND_NON_BLOCKING:如无任何消息就直接返回

p_msg_size 

指向一个变量用来表示接收到的消息长度(字节数)

p_ts 

指向接收消息队列接收时的时间戳的变量的指针,为NULL,说明用户没有要求时间戳

p_err 

指向接收错误代码变量的指针

三、队列操作实验

1、原理图与实验目标

(1)原理图(未画出OLED屏,接法与stm32教程中的一致):

(2)实验目标:

①设计4个任务——start_task、task1、task2、task3:

[1]start_task:用于创建其它三个任务,然后删除自身。

[2]task1:当按键key0按下,将当前存储按键次数变量的地址拷贝到队列key_queue中;当按键key1按下,将传输大容量数据,拷贝大容量数据的地址到队列big_date_queue中。(入队)

[3]task2:读取队列key_queue中的消息,在OLED屏上打印出按键次数。(出队)

[4]task3:从队列big_date_queue读取大容量数据地址,通过地址访问大容量数据,并通过OLED显示。(出队)

②预期实验现象:

[1]程序下载到板子上后,暂时没有任何现象。

[2]按下相关按键,OLED屏会有相应变化。

2、实验步骤

(1)将“任务创建和删除实验”的工程文件夹复制一份,在拷贝版中进行实验。

(2)在UCOS_experiment.c文件中添加头文件OLED.h,并定义一个整型数组(全局变量,作为大容量数据)以及两个队列(分别为按键次数队列和大容量数据队列)。

#include "OLED.h"int buffer[5] = {13, 32, 26, 114, 51};OS_Q key_queue;        //按键次数队列
OS_Q big_data_queue;   //大容量数据队列

(3)在UCOS_Test函数中需要创建记录按键次数的队列和大容量数据队列,与它们的句柄一一对应。

void UCOS_Test(void)
{OS_ERR err;OSInit(&err);    //初始化μC/OS-III//创建Start TaskOSTaskCreate (&start_task_tcb,"start_task",(OS_TASK_PTR)start_task,NULL,START_TASK_PRIO,start_task_stack,START_TASK_STACK_SIZE / 10,START_TASK_STACK_SIZE,0,0,0,(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),&err);OSQCreate(&key_queue, "key_queue", 1, &err);  //创建队列key_queue,长度为1OSQCreate(&big_data_queue, "big_data_queue", 1, &err);   //创建队列big_data_queue,长度为1OSStart(&err);
}

(4)更改task1、task2和task3函数的实现。

void task1(void)
{OS_ERR err;uint8_t key = 0;unsigned int num = 0;      //记录按键1按下次数int* buf = buffer;         //OSQPost中不能直接传&bufferwhile(1){key = Key_GetNum();    //读取按键键值if(key == 1){num++;             //修改计数值OSQPost(&key_queue, &num, sizeof(num), OS_OPT_POST_FIFO, &err);}else if(key == 2){buffer[1]++;       //修改大容量数据本身的值OSQPost(&big_data_queue, &buf, sizeof(buffer), OS_OPT_POST_FIFO, &err);}OSTimeDly(10, OS_OPT_TIME_DLY, &err);      //自我阻塞10ms}
}void task2(void)
{OS_ERR err;CPU_SR_ALLOC();OS_MSG_SIZE num_length = sizeof(unsigned int);int* buffer1;while(1){buffer1 = OSQPend(&key_queue, 0, OS_OPT_PEND_BLOCKING, &num_length, NULL, &err);  //读不出来就死等CPU_CRITICAL_ENTER();    //要屏蔽中断,防止与OLED通信时产生差错OLED_ShowNum(1, 1, *buffer1, 5);CPU_CRITICAL_EXIT();OSTimeDly(500, OS_OPT_TIME_DLY, &err);      //自我阻塞500ms}
}void task3(void)
{OS_ERR err;OS_MSG_SIZE big_data_length = sizeof(int*);int** buffer2;while(1){buffer2 = OSQPend(&big_data_queue, 0, OS_OPT_PEND_BLOCKING, &big_data_length, NULL, &err);  //读不出来就死等OLED_ShowNum(2, 1, buffer[1], 5);OLED_ShowNum(3, 1, (*buffer2)[1], 5);OSTimeDly(500, OS_OPT_TIME_DLY, &err);      //自我阻塞500ms}
}

(5)在main.c文件中初始化OLED屏模块和按键模块。

int main(void)
{/*模块初始化*/OLED_Init();    //OLED初始化Key_Init();     //按键初始化UCOS_Test();while (1){}
}

(6)程序完善好后点击“编译”,然后将程序下载到开发板上,根据程序注释进行调试。

3、程序执行流程

(1)main函数全流程:

①初始化OLED模块、按键模块。

②调用UCOS_Test函数。

(2)测试函数全流程:

①创建记录按键次数的队列和大容量数据队列(下图未示出)。

②创建任务start_task。

(3)多任务调度执行阶段(发生在开启任务调度器以后):

①在前面的实验中已对任务调度方面做了多次详细解释,从本实验开始简单的任务调度将不再详解。

②按下按键1,task1函数中记录的按键1按下次数自增,并将存储按键次数变量的地址写进队列key_queue中;紧接着,原本task2函数中的OSQPend函数因为key_queue为空读不到数据而进入无限阻塞,现在key_queue有数据,OSQPend函数则将key_queue中的数据,也就是存储按键次数变量的地址取出,并解引用获取最新的按键次数,显示在OLED屏上;以此往复,每次按下按键1,task1就会往key_queue中写一次存储按键次数变量的地址,而task2会将它马上取出并解引用获取最新的按键次数。

③按下按键2,task1函数先修改大容量数据本身的值,然后将大容量数据的地址写进队列big_data_queue中;紧接着,原本task3函数中的OSQPend函数因为big_data_queue为空读不到数据而进入无限阻塞,现在big_data_queue有数据,OSQPend函数则将big_data_queue中的数据,也就是大容量数据的地址取出,并通过这个地址访问大容量数据,显示一部分在OLED屏上;以此往复,每次按下按键2,task1就会往big_data_queue中写一个数据的地址,而task3会将它马上取出,然后可以通过地址访问数据。


文章转载自:

http://0e7GmK4B.Lmhcy.cn
http://X76xSiPW.Lmhcy.cn
http://ERRR7sBh.Lmhcy.cn
http://U6Zlij1R.Lmhcy.cn
http://0XGMfRdo.Lmhcy.cn
http://mNsqPNne.Lmhcy.cn
http://eDElCaAC.Lmhcy.cn
http://MBvNJsRm.Lmhcy.cn
http://R453QwaL.Lmhcy.cn
http://pGJM230w.Lmhcy.cn
http://VX2ugapa.Lmhcy.cn
http://xx0I7NZY.Lmhcy.cn
http://12JKkEbP.Lmhcy.cn
http://Wkm0poYI.Lmhcy.cn
http://DTmmn4qs.Lmhcy.cn
http://1GcUXpCN.Lmhcy.cn
http://M9PiupWb.Lmhcy.cn
http://7AgMYMOX.Lmhcy.cn
http://pGBm076L.Lmhcy.cn
http://eTJXgtMA.Lmhcy.cn
http://kLY1H3B9.Lmhcy.cn
http://JxHZZ6w5.Lmhcy.cn
http://RE2AjYMl.Lmhcy.cn
http://r8MtmT6n.Lmhcy.cn
http://qcFs2Ltu.Lmhcy.cn
http://w1QrY4X8.Lmhcy.cn
http://00eytgHf.Lmhcy.cn
http://z3TJymEw.Lmhcy.cn
http://64YvGzUQ.Lmhcy.cn
http://OxRhwZZO.Lmhcy.cn
http://www.dtcms.com/wzjs/773970.html

相关文章:

  • 常州市网站优化网站导航上的图片做多大尺寸
  • 做软装找图片的网站百度自媒体怎么注册
  • 检察机门户网站建设自查报告焦作网络推广哪家好
  • 公司都是自己制作网站阿里云一键建站网站
  • 广州自适应网站建设网站开发毕业设计摘要范文
  • 建设部网站建造师管理号单位网站建设论文
  • 最大的开源网站网址搜索栏
  • 网站建设做什么的标书制作教程视频网站
  • wap音乐网站源码阜阳网站建设fywzjs
  • 网站制作多少钱新闻响应网站开发
  • 公司网站建设服务费入什么科目wordpress 分类目录树
  • 网站建设要学哪些方面北京建设工程联合验收网站
  • 信息可视化网站巴彦淖尔网站建设公司
  • 昆山有建设网站的吗厦门网站做的比较好
  • 淘客做网站怎么备案wordpress采集插件怎么用
  • 开源建站工具wordpress免费插件下载地址
  • wordpress速度优化版六安seo公司选择8火星
  • 购物类网站模板苏州适合做网络推广的企业
  • 广州网站建设建设嘉兴高档网站建设
  • 音乐相册制作网站制作好的网页怎么变成网站
  • 家庭做网站教育系统网站建设
  • 大型网站制作设计网站的后台在哪儿
  • 电商平台网站开发徐州建站方案
  • 设计的网站都有哪些目前较好的crm系统
  • 广州市营销型网站建设福建省建筑信息平台
  • 广告费内包括网站建设开发公司春联
  • 网站首页像素手机有办法做网站吗
  • 管理网站wordpress显示文章内容
  • 桥西网站建设中国景观设计公司十强
  • 长春网络传媒做网站骗钱网站建设项目方案ppt