>上文主要介绍了邮箱管理相关的函数,本文介绍内存管理相关的函数:OSMemCreate()内存块创建函数,OSMemGet()函数,OSMemPut()函数,OSMemQuery()函数.以前用过的uC/OS-II笔记分享到这里。
内存管理介绍
在ANSI C中可以用malloc()和free()两个函数动态地分配内存和释放内存。但是,在嵌入式实时操作系统中,多次这样做会把原来很大的一块连续内存区域,逐渐地分割成许多非常小而且彼此又不相邻的内存区域,也就是内存碎片。由于这些碎片的大量存在,使得程序到后来连非常小的内存也分配不到。另外,由于内存管理算法的原因,malloc()和free()函数执行时间是不确定的。在μC/OS-II中,操作系统把连续的大块内存按分区来管理。每个分区中包含有整数个大小相同的内存块。利用这种机制,μC/OS-II 对malloc()和free()函数进行了改进,使得它们可以分配和释放固定大小的内存块。这样一来,malloc()和free()函数的执行时间也是固定的了。在一个系统中可以有多个内存分区。这样,用户的应用程序就可以从不同的内存分区中得到不同大小的内存块。但是,特定的内存块在释放时必须重新放回它以前所属于的内存分区。显然,采用这样的内存管理算法,上面的内存碎片问题就得到了解决。
为了便于内存的管理,在μC/OS-II中使用内存控制块(memory control blocks)的数据结构来跟踪每一个内存分区,系统中的每个内存分区都有它自己的内存控制块。内存控制块的定义如下:typedef struct {void *OSMemAddr; //指向内存分区起始地址的指针void *OSMemFreeList; //是指向下一个空闲内存控制块或者下一个空闲的内存块的指针INT32U OSMemBlkSize; //是内存分区中内存块的大小INT32U OSMemNBlks; //内存分区中总的内存块数量INT32U OSMemNFree; //内存分区中当前可以得空闲内存块数量} OS_MEM;如果要在μC/OS-II中使用内存管理,需要在OS_CFG.H文件中将开关量OS_MEM_EN设置为1。这样μC/OS-II 在启动时就会对内存管理器进行初始化[由OSInit()调用OSMemInit()实现]。常数OS_MAX_MEM_PART(见文件OS_CFG.H)定义了最大的内存分区数,该常数值最小应为2。
注意的事项
使用内存管理模块需要做的工作还有:1.打开配置文件OS_CFG.H,将开关量OS_MEM_EN设置为1:#define OS_MEM_EN 02.打开配置文件OS_CFG.H,设置系统要建立的任务分区的数量:#define OS_MAX_MEM_PART 2
OSMemCreate()内存块创建函数
1 主要作用: 该函数建立并初始化一个用于动态内存分配的区域,该内存区域包含指定数目的、大小确定的内存块。应用可以动态申请这些内存块并在用完后将其释放回这个内存区域。该函数的返回值就是指向这个内存区域控制块的指针,并作为OSMemGet(),OSMemPut(),OSMemQuery() 等相关调用的参数。2函数原型:OS_MEM *OSMemCreate( void *addr, INT32U nblks, INT32U blksize, INT8U *err );3参数说明:addr 建立的内存区域的起始地址。可以使用静态数组或在系统初始化时使用 malloc() 函数来分配这个区域的空间。nblks 内存块的数目。每一个内存区域最少需要定义两个内存块。blksize 每个内存块的大小,最小应该能够容纳一个指针变量。err 是指向包含错误码的变量的指针。Err可能是如下几种情况:OS_NO_ERR :成功建立内存区域。OS_MEM_INVALID_ADDR :非法地址,即地址为空指针。OS_MEM_INVALID_PART :没有空闲的内存区域。OS_MEM_INVALID_BLKS :没有为内存区域建立至少两个内存块。OS_MEM_INVALID_SIZE :内存块大小不足以容纳一个指针变量。5、函数主体在os_men.c中4返回值说明:OSMemCreate() 函数返回指向所创建的内存区域控制块的指针。如果创建失败,函数返回空指针。
OSMemGet()函数
1 主要作用: 该函数用于从内存区域分配一个内存块。用户程序必须知道所建立的内存块的大小,并必须在使用完内存块后释放它。可以多次调用 OSMemGet() 函数。它的返回值就是指向所分配内存块的指针,并作为 OSMemPut() 函数的参数。2函数原型:void *OSMemGet(OS_MEM *pmem, INT8U *err);3参数说明:pmem 是指向内存区域控制块的指针,可以从 OSMemCreate() 函数的返回值中得到。err 是指向包含错误码的变量的指针。Err可能是如下情况:OS_NO_ERR :成功得到一个内存块。OS_MEM_NO_FREE_BLKS :内存区域中已经没有足够的内存块。4返回值说明:OSMemGet() 函数返回指向所分配内存块的指针。如果没有可分配的内存块,OSMemGet() 函数返回空指针。5、函数主体在os_men.c中
OSMemPut()
1 主要作用:该函数用于释放一个内存块,内存块必须释放回它原先所在的内存区域,否则会造成系统错误。2函数原型:INT8U OSMemPut (OS_MEM *pmem, void *pblk);3参数说明:pmem 是指向内存区域控制块的指针,可以从 OSMemCreate() 函数的返回值中得到。pblk 是指向将被释放的内存块的指针。4返回值说明:OSMemPut() 函数的返回值为下述之一:OS_NO_ERR :成功释放内存块OS_MEM_FULL :内存区域已满,不能再接受更多释放的内存块。这种情况说明用户程序出现了错误,释放了多于用 OSMemGet() 函数得到的内存块。5、函数主体在os_men.c中
OSMemQuery()
1 主要作用:该函数用于得到内存区域的信息。2函数原型:INT8U OSMemQuery(OS_MEM *pmem, OS_MEM_DATA pdata);3参数说明:pmem 是指向内存区域控制块的指针,可以从 OSMemCreate() 函数的返回值中得到。pdata 是一个指向 OS_MEM_DATA 数据结构的指针,该数据结构包含了以下的域:void OSAddr; / 指向内存区域起始地址的指针 /void OSFreeList; / 指向空闲内存块列表起始地址的指针 /INT32U OSBlkSize; / 每个内存块的大小 /INT32U OSNBlks; / 该内存区域中的内存块总数 /INT32U OSNFree; / 空闲的内存块数目 /INT32U OSNUsed; / 已使用的内存块数目 */4返回值说明:函数返回值总是OS_NO_ERR。5、函数主体在os_men.c中
附os_men.c代码
/*
*********************************************************************************************************
* uC/OS-II
* The Real-Time Kernel
* MEMORY MANAGEMENT
*
* (c) Copyright 1992-2013, Micrium, Weston, FL
* All Rights Reserved
*
* File : OS_MEM.C
* By : Jean J. Labrosse
* Version : V2.92.08
*
* LICENSING TERMS:
* ---------------
* uC/OS-II is provided in source form for FREE evaluation, for educational use or for peaceful research.
* If you plan on using uC/OS-II in a commercial product you need to contact Micrium to properly license
* its use in your product. We provide ALL the source code for your convenience and to help you experience
* uC/OS-II. The fact that the source is provided does NOT mean that you can use it without paying a
* licensing fee.
*********************************************************************************************************
*/
# define MICRIUM_SOURCE
# ifndef OS_MASTER_FILE
# include <ucos_ii.h>
# endif
# if (OS_MEM_EN >
0u) && (OS_MAX_MEM_PART >
0u)
/*
*********************************************************************************************************
* CREATE A MEMORY PARTITION
*
* Description : Create a fixed-sized memory partition that will be managed by uC/OS-II.
*
* Arguments : addr is the starting address of the memory partition
*
* nblks is the number of memory blocks to create from the partition.
*
* blksize is the size (in bytes) of each block in the memory partition.
*
* perr is a pointer to a variable containing an error message which will be set by
* this function to either:
*
* OS_ERR_NONE if the memory partition has been created correctly.
* OS_ERR_MEM_INVALID_ADDR if you are specifying an invalid address for the memory
* storage of the partition or, the block does not align
* on a pointer boundary
* OS_ERR_MEM_INVALID_PART no free partitions available
* OS_ERR_MEM_INVALID_BLKS user specified an invalid number of blocks (must be >
= 2)
* OS_ERR_MEM_INVALID_SIZE user specified an invalid block size
* - must be greater than the size of a pointer
* - must be able to hold an integral number of pointers
* Returns : != (OS_MEM *)0 is the partition was created
* == (OS_MEM *)0 if the partition was not created because of invalid arguments or, no
* free partition is available.
*********************************************************************************************************
*/
OS_MEM *OSMemCreate (void *addr,
INT32U nblks,
INT32U blksize,
INT8U *perr)
{
OS_MEM *pmem;
INT8U *pblk;
void **plink;
INT32U loops;
INT32U i;
# if OS_CRITICAL_METHOD == 3u /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr = 0u;
# endif
# ifdef OS_SAFETY_CRITICAL
if (perr == (INT8U *)0) {
OS_SAFETY_CRITICAL_EXCEPTION();
return ((OS_MEM *)0);
}
# endif
# ifdef OS_SAFETY_CRITICAL_IEC61508
if (OSSafetyCriticalStartFlag == OS_TRUE) {
OS_SAFETY_CRITICAL_EXCEPTION();
return ((OS_MEM *)0);
}
# endif
# if OS_ARG_CHK_EN >
0u
if (addr == (void *)0) { /* Must pass a valid address for the memory part.*/
*perr = OS_ERR_MEM_INVALID_ADDR;
return ((OS_MEM *)0);
}
if (((INT32U)addr & (sizeof(void *) - 1u)) != 0u){ /* Must be pointer size aligned */
*perr = OS_ERR_MEM_INVALID_ADDR;
return ((OS_MEM *)0);
}
if (nblks < 2u) { /* Must have at least 2 blocks per partition */
*perr = OS_ERR_MEM_INVALID_BLKS;
return ((OS_MEM *)0);
}
if (blksize < sizeof(void *)) { /* Must contain space for at least a pointer */
*pHTML标签----图文详解 - 生命壹号 阅读原文»国庆节快乐,还在加班的童鞋,良辰必有重谢!
本文主要内容
- 排版标签:
<p>
<br>
<hr>
<center>
<pre>
<div>
<span>
- 字体标记:
<h1>
<font>
<b>
<u>
<sup>
<sub>
- 超链接
- 图片标签
- 清单标记
- 表格标记
- 框架标记及
<iframe>
- 表单标记及语义化
- 多媒体标记
- 头标记
一、HTML的介绍1、HTML的概述:
html全称为HyperText Mackeup Language,译为超文本标记语言,不是一种编程语言,是一种描述性的标记语言,用于描述超文本中内容的显示方式。比如字体什么颜色,大小等。
- 超文本:音频,视频,图片称为超文本。
- 标记 :<英文单词或者字母>称为标记,一个HTML页面都是由各种标记组成。
作用:编写HTML页面。
注意:HTML语言不是一个编程语言(有编译过程),而是一个标记语言(没有编译过程),HTML页面直接由浏览器解析执行。
2、HTML的历史:
3、HTML的网络术语:- 网页 :由各种标记组成的一个页面就叫网页
- 主页(首页) : 一个网站的起始页面或者导航页面
- 标记:
<p>
称为开始标记 ,</p>
称为结束标记,也叫标签。每个标签都规定好了特殊的含义。
- 元素:
<p>内容</p>
称为元素.
- 属性:给每一个标签所做的辅助信息。
- xhtml: 符合XML语法标准的HTML。
- dhtml:dynamic,动态的。
javascript + css + html
合起来的页面就是一个dhtml。
- http:超文本传协议。用来规定客户端浏览器和服务端交互时数据的一个格式。SMTP 邮件传输协议,ftp:文件传输协议。
4、HTML的编辑工具:- NotePad:记事本。
- EditPlus:语法高亮显示。技巧: 根据颜色判断单词是否出错 (不是100%)。不好的地方:没有代码提示。
- UltraEdit:根据颜色判断单词是否出错,可以显示2进制数据。
- Sublime:新一代的代码编辑器。
- dw(dreamweaver,专业工具) :有代码提示。
二、HTML的规范- HTML是一个弱势语言
- HTML不区分大小写
- HTML页面的后缀名是html或者htm(有一些系统不支持后缀名长度超过3个字符,比如dos系统)
- HTML的结构:
声明部分:主要作用是用来告诉浏览器这个页面使用的是那个标准。是HTML5标准。
head部分: 不会显示在页面上,作用是告诉服务器一些页面的额外信息。
body部分:我们所写的代码必须放在此标签�取�
例如,打开EditPlus软件,新建一个html文件,自动生成的代码如下:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="Generator" content="EditPlus">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
<title>Document</title>
</head>
<body>
</body>
</html>
目前,IE浏览器是完全不支持H5的,支持最好的是Opera浏览器,可以支持95%以上;其次是google,可以支持一部分H5。
三、HTML的各种标签备注
- 所有的浏览器默认情况下都会忽略空格和空行
- 每个标签都有私有属性。也都有公有属性。
- html中表示长度的单位都是像素。HTML只有一种单位就是像素。
- body:
bgcolor: 背景颜色。
background:背景图片。
text: 文本颜色。
1、排版标签
注释标签
<!-- 注释 -->
段落标签<p>
<p>This is a paragraph</p>
<p>This is another paragraph</p>
属性:
align="属性值"
:对齐方式。属性值包括left center right。
举例:
换行标签<br>
当你打算结束一行,而又不想开始一个新段落时,<br>
标签就派上用场了。无论你将它置于何处,<br>
标签都会产生一个强制的换行。
This <br> is a para<br>graph with line breaks
效果如下:
上图可以看到,<p>
标签和<br>
标签的区别在于:<p>
标签有空行,而<br>
标签没有空行;而且<br>
标签没有属性。
注意<br>
没有结束标签,把<br>
标签写为 <br/>
是经得起未来考验的做法,XHTML 和 XML 都接受在打开的标签内部来关闭标签的做法。
水平线标签<hr>
水平分隔线(horizontal rule)可以在视觉上将文档分隔成各个部分。
效果如下:
属性:
align="属性值"
:设定线条置放位置。属性值可选择:left right center。
size="2"
:设定线条粗细。以像素为单位,内定为2。
width="500"
或width="70%"
:设定线条长度。可以是绝对值(单位是像素)或相对值。如果设置为相对值的话,内定为100%。
color="#0000FF"
:设置线条颜色。 『只适用于IE』
noshade
:不要阴影,即设定线条为平面显示。若没有这个属性则表明线条具阴影或立体,这是内定值。
属性效果演示:
内容居中标签<center>
此时center代表是一个标签,而不是一个属性值了。只要是在这个标签里面的内容,都会居于浏览器的中间。
效果演示:
到了H5里面,center标签不建议使用。
预定义(预格式化)标签<pre>
预定义标签<pre>
,告诉浏览器不要忽略空格和空行。
效果演示:
上图中,好像红框部分的字体变小了,而且还出现了缩进,好吧, 这个其实是浏览器搞的鬼。
为什么要有<pre>
这个标签呢?答案是:
所有的浏览器默认情况下都会忽略空格和空行。
好吧,其实这个标签也用的比较少。
块级标签 <div>
把标签中的额内容作为一个块儿来对待(division)。必须单独占据一行。
属性:
align="属性值"
:设置块儿的位置。属性值可选择:left right center。
块级标签 <span>
<span>
和<div>
唯一的区别在于:<span>
是不换行的,而<div>
是换行的。
效果举例:
2、字体标签
标题
标题使用<h1>
至<h6>
标签进行定义。<h1>
定义最大的标题,<h6>
定义最小的标题。具有align属性。
效果演示:
字体标签<font>
属性:
color="红色"
或color="#ff00cc"
或color="new rgb(0,0,255)"
:设置字体颜色。
设置方式:单词 \ #ff00cc \ rgb(0,0,255)
size
:设置字体大小。 取值范围只能是:1至7。取值时,如果取值大于7那就按照7来算,如果取值小于1那就按照1来算。如果想要更大的字体,那就只能通过css样式来解决。
设置:用'+2'代表值是5 或直接给值
face="微软雅黑"
:设置字体类型。注意在写字体时,"微软雅黑"这个字不能写错。
举例:
<font face="微软雅黑" color="#FF0000" size="10">vae</font>
效果:
特殊字符
:空格
<
:小于号
>
:大于号
&
:符号&
"
:双引号
'
:单引号
©
:版权
™
:商标
绐
:文字绐
。其实,#32464
是汉字绐
的unicode编码。
比如说,你想把<p>
作为一个文本在页面上显示,直接写<p>
是肯定不行的,因为这代表的是一个段落标签,所以这里需要用到转义字符。应该这么写:
这是一个HTML语言的<p>标签
正确的效果如下:
错误的效果如下:
其实我们只要记住前三个符号就行了,其他的在需要的时候查一下就行了。而且,EditPlus软件中是可以直接点击这些符
没有评论:
发表评论