2015年9月30日星期三

uC/OS-II 函数之内存管理相关函数 - One-peace

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
uC/OS-II 函数之内存管理相关函数 - One-peace  阅读原文»

>上文主要介绍了邮箱管理相关的函数,本文介绍内存管理相关的函数: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 */
*p
HTML标签----图文详解 - 生命壹号  阅读原文»

国庆节快乐,还在加班的童鞋,良辰必有重谢!

本文主要内容

  • 排版标签:<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的历史:

html中标签发展趋势.png

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。
    举例:

Paste_Image.png


换行标签<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)可以在视觉上将文档分隔成各个部分。
效果如下:

Paste_Image.png

属性:

  • align="属性值":设定线条置放位置。属性值可选择:left right center。
  • size="2":设定线条粗细。以像素为单位,内定为2。
  • width="500"width="70%":设定线条长度。可以是绝对值(单位是像素)或相对值。如果设置为相对值的话,内定为100%。
  • color="#0000FF":设置线条颜色。 『只适用于IE』
  • noshade:不要阴影,即设定线条为平面显示。若没有这个属性则表明线条具阴影或立体,这是内定值。
    属性效果演示:

Paste_Image.png


内容居中标签<center>

此时center代表是一个标签,而不是一个属性值了。只要是在这个标签里面的内容,都会居于浏览器的中间。
效果演示:

Paste_Image.png

到了H5里面,center标签不建议使用。


预定义(预格式化)标签<pre>

预定义标签<pre>,告诉浏览器不要忽略空格和空行。
效果演示:

Paste_Image.png

上图中,好像红框部分的字体变小了,而且还出现了缩进,好吧, 这个其实是浏览器搞的鬼。
为什么要有<pre>这个标签呢?答案是:

所有的浏览器默认情况下都会忽略空格和空行。

好吧,其实这个标签也用的比较少。


块级标签 <div>

把标签中的额内容作为一个块儿来对待(division)。必须单独占据一行。

属性:

  • align="属性值":设置块儿的位置。属性值可选择:left right center。


块级标签 <span>

<span><div>唯一的区别在于:<span>是不换行的,而<div>是换行的。
效果举例:

Paste_Image.png

2、字体标签

标题

标题使用<h1><h6>标签进行定义。<h1>定义最大的标题,<h6>定义最小的标题。具有align属性。
效果演示:

Paste_Image.png

字体标签<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>

    效果:

Paste_Image.png

特殊字符

  • :空格
  • <:小于号
  • >:大于号
  • &:符号&
  • ":双引号
  • ':单引号
  • ©:版权
  • :商标
  • :文字。其实,#32464是汉字的unicode编码。

比如说,你想把<p>作为一个文本在页面上显示,直接写<p>是肯定不行的,因为这代表的是一个段落标签,所以这里需要用到转义字符。应该这么写:

这是一个HTML语言的<p>标签

正确的效果如下:

Paste_Image.png

错误的效果如下:

Paste_Image.png

其实我们只要记住前三个符号就行了,其他的在需要的时候查一下就行了。而且,EditPlus软件中是可以直接点击这些符

阅读更多内容

没有评论:

发表评论