搜档网
当前位置:搜档网 › UCOS API函数库

UCOS API函数库

UCOS API函数库
UCOS API函数库

目录

一、任务管理OS_TASK.C(API) (1)

1.1改变任务的优先级 (2)

1.2建立任务 (3)

1.3建立带扩展任务 (4)

1.4删除一个任务 (5)

1.5安全删除一个任务 (6)

1.6唤醒一个任务 (7)

1.7检查任务堆栈状态 (7)

1.8挂起一个任务 (7)

1.9获取任务信息 (8)

二、时钟管理OS_TIME.C(API) (9)

2.1延时若干个时钟 (9)

2.2长延时 (9)

2.3唤醒延时程序 (10)

2.4获取当前系统时钟数值 (10)

2.5设置当前系统时钟数值 (11)

三、信号量OS_SEM.C(API) (11)

3.1请求一个信号量 (11)

3.2建立一个信号量 (11)

3.3删除一个信号量 (12)

3.4等待一个信号量 (12)

3.5发出一个信号量 (13)

3.6查询一个信号量的当前状态 (13)

一、任务管理OS_TASK.C(API)

1、改变一个任务的优先级

INT8U OSTaskChangePrio (INT8U oldprio, INT8U newprio)

调用:OSTaskChangePrio (5, 10); //把优先级为5的改为10

2、建立一个任务

INT8U OSTaskCreate (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio)

OSTaskCreate (MyTask,(void *)0, &Task0Stk[Task0StkLengh - 1], 10);

MyTask指向的函数名,(void *)0就是指向空的意思

3 建立一个任务

INT8U OSTaskCreateExt (void (*task)(void *pd), //建立扩展任务(任务代码指针

void *pdata, //传递参数指针

OS_STK *ptos, //分配任务堆栈栈顶指针

INT8U prio, //分配任务优先级

INT16U id, //(未来的)优先级标识(与优先级相同)

OS_STK *pbos, //分配任务堆栈栈底指针

INT32U stk_size, //指定堆栈的容量(检验用)

void *pext, //指向用户附加的数据域的指针

INT16U opt) //建立任务设定选项)

4、删除任务(删除有占用共享资源任务会出错)

INT8U OSTaskDel (INT8U prio) //删除任务(任务的优先级)

5、删除任务(可靠删除任务并清理占用共享资源)

INT8U OSTaskDelReq (INT8U prio) //请求一个任务删除其它任务或自身?(任务的优先级)

6、唤醒任务

INT8U OSTaskResume (INT8U prio) //唤醒一个用OSTaskSuspend()函数挂起的任务(任务的优先级) 7、挂起任务

INT8U OSTaskSuspend (INT8U prio) //无条件挂起一个任务(任务优先级)

8、获取任务信息

INT8U OSTaskQuery (INT8U prio, OS_TCB *pdata) //获取任务信息(任务指针、保存数据结构指针) 9、检查任务堆栈状态,计算指定任务堆栈中的未用空间和已用空间(STACK CHECKING)

INT8U OSTaskStkChk (INT8U prio, OS_STK_DATA *pdata)

610 * 描述: 检查任务堆栈状态,计算指定任务堆栈中的未用空间和已用空间。使用OSTaskStkChk()函数要求所检查的任务是被OSTaskCreateExt()函数建立的,且opt参数中OS_TASK_OPT_STK_CHK操作项打开。611 * 计算堆栈未用空间的方法是从堆栈底端向顶端逐个字节比较,检查堆栈中0的个数,直到一个非0的数值出现.这种方法的前提是堆栈建立时已经全部清零.要实现清零操作,需要在任务建立初始化

612 * 堆栈时设置OS_TASK_OPT_STK_CLR为1.如果应用程序在初始化时已经将全部RAM清零,且不进行任

613* 任务删除操作,也可以设置OS_TASK_OPT_STK_CLR为0,这将加快OSTaskCreateExt()函数的执行速度。

1.1改变任务的优先级

/***********************************************************************************

19 * 改变一个任务的优先级(CHANGE PRIORITY OF A TASK)

21 * 描述: 改变一个任务的优先级。

23 * 参数: oldp 是任务原先的优先级。

25 * newp 是任务的新优先级。

27 * 返回: OS_NO_ERR 任务优先级成功改变。

28 * OS_PRIO_INVALID 参数中的任务原先优先级或新优先级大于或等于OS_LOWEST_PRIO。

29 * (i.e. >= OS_LOWEST_PRIO)

30 * OS_PRIO_EXIST 优先级为PIP的任务已经存在;

31 * OS_PRIO_ERR 参数中的任务原先优先级不存在。

33 * 注意: 参数中的新优先级必须是没有使用过的,否则会返回错误码.在OSTaskChangePrio()中还会先

34 * 判断要改变优先级的任务是否存在。

***********************************************************************************/

INT8U OSTaskChangePrio (INT8U oldprio, INT8U newprio)

调用:OSTaskChangePrio (5, 10); //把优先级为5的改为10

1.2建立任务

/***************************************************************************************** 125 * 建立一个新任务(CREATE A TASK)

127 * 描述: 建立一个新任务。任务的建立可以在多任务环境启动之前,也可以在正在运行的任务中建立.中断处理程序中不能建立任务.一个任务必须为无限循环结构(如下所示),且不能有返回点。

129 * OSTaskCreate()是为与先前的μC/OS版本保持兼容,新增的特性在OSTaskCreateExt()函数中.

130 * 无论用户程序中是否产生中断,在初始化任务堆栈时,堆栈的结构必须与CPU中断后寄存器入栈的顺序结构相同.详细说明请参考所用处理器的手册。

133 * 参数: task 是指向任务代码的指针。

135 * pdata 指向一个数据结构,该结构用来在建立任务时向任务传递参数。下例中说明uC/OS中的任务结构以及如何传递参数pdata:

137 * void Task (void *pdata)

138 * {

139 * ... // 对参数'pdata'进行操作

140 * for (;;) {

// 任务函数体.

143 * // 在任务体中必须调用如下函数之一:

144 * // OSMboxPend() 用于任务等待消息,消息通过中断或另外的任务发送给需要的任务

145 * // OSFlgPend() 用于任务等待事件标志中的事件标志

146 * // OSMutexPend() 任务需要独占资源

147 * // OSQPend() 用于任务等待消息

148 * // OSSemPend() 用于任务试图取得共享资源的使用权,任务需要与其它任务或中断

149 * 同步及任务需要等待特定事件的发生场合

150 * // OSTimeDly() 任务延时若干时钟节拍

151 * // OSTimeDlyHMSM() 任务延时若干时间

152 * // OSTaskSuspend() 挂起任务本身

153 * // OSTaskDel() 删除任务本身

154 * ...

156 * }

157 * ptos 为指向任务堆栈栈顶的指针。任务堆栈用来保存局部变量,函数参数,返回地址以及任务被中断时的CPU寄存器内容.任务堆栈的大小决定于任务的需要及预计的中断嵌套层数。计算堆栈的大小,需要知道任务的局部变量所占的空间,可能产生嵌套调用的函数,及中断嵌套所需空间。如果初始化常量

OS_STK_GROWTH设为1,堆栈被设为从内存高地址向低地址增长,此时ptos应该指向任务堆栈空间的最高地址。反之,如果OS_STK_GROWTH设为0,堆栈将从内存的低地址向高地址增长。

164 * prio 为任务的优先级。每个任务必须有一个唯一的优先级作为标识。数字越小,优先级越高。166 * 返回: OS_NO_ERR 函数调用成功;

167 * OS_PRIO_EXIT 具有该优先级的任务已经存在;

168 * OS_PRIO_INVALID 参数指定的优先级大于OS_LOWEST_PRIO; (i.e. >= OS_LOWEST_PRIO)

169 * OS_NO_MORE_TCB 系统中没有OS_TCB可以分配给任务了。

170 *

171 * 注意: 1、任务堆栈必须声明为OS_STK类型。

172 * 2、在任务中必须调用uC/OS提供的下述过程之一:延时等待、任务挂起、等待事件发生(等待信

173 * 号量,消息邮箱、消息队列),以使其他任务得到CPU。

174 * 3、用户程序中不能使用优先级0,1,2,3,以及OS_LOWEST_PRIO-3,OS_LOWEST_PRIO-2,

OS_LOWEST_PRIO-1, OS_LOWEST_PRIO。这些优先级μC/OS系统保留,其余的56个优先级提供给应用程序。177 ***********************************************************************************/

181 INT8U OSTaskCreate (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio) OSTaskCreate (Task0,(void *)0, &Task0Stk[Task0StkLengh - 1], 10);

1.3建立带扩展任务

221 **************************************************************************************** 222 * CREATE A TASK (Extended Version)

224 * 描述: 建立一个新任务。与OSTaskCreate()不同的是,OSTaskCreateExt()允许用户设置更多的细节内容.任务的建立可以在多任务环境启动之前,也可以在正在运行的任务中建立,但中断处理程序中不能建立新任务。一个任务必须为无限循环结构(如下所示),且不能有返回点。

228 * 参数: task 是指向任务代码的指针。

230 * pdata Pdata指针指向一个数据结构,该结构用来在建立任务时向任务传递参数。下例中说

231 * 明uC/OS中的任务代码结构以及如何传递参数pdata:(如果在程序中不使用参数pdata,

232 * 为了避免在编译中出现"参数未使用"的警告信息,可以写一句pdata= pdata;)

233 * void Task (void *pdata)

234 * {

235 * ... //对参数pdata进行操作,例如pdata= pdata

236 * for (;;) { // 任务函数体.总是为无限循环结构

252 * }

253 * }

254 * ptos 为指向任务堆栈栈顶的指针.任务堆栈用来保存局部变量,函数参数,返回地址以及中断时的CPU 寄存器内容.任务堆栈的大小决定于任务的需要及预计的中断嵌套层数.计算堆栈的大小,需要知道任务的

局部变量所占的空间,可能产生嵌套调用的函数,及中断嵌套所需空间.如果初始化常量OS_STK_GROWTH设为1,堆栈被设为向低端增长(从内存高地址向低地址增长).此时ptos应该指向任务堆栈空间的最高地址.反之, 如果OS_STK_GROWTH设为0,堆栈将从低地址向高地址增长.

261 * prio 任务的优先级。每个任务必须有一个唯一的优先级作为标识.数字越小,优先级越高。

263 * id 是任务的标识,目前这个参数没有实际的用途,但保留在OSTaskCreateExt()中供今后扩展,应用

程序中可设置id与优先级相同.(0..65535)

266 * pbos 为指向堆栈底端的指针。如果初始化常量OS_STK_GROWTH设为1,堆栈被设为从内存高地址向低

地址增长.此时pbos应该指向任务堆栈空间的最低地址.反之,如果OS_STK_GROWTH设为0,堆栈将从低地址向高地址增长。pbos应该指向堆栈空间的最高地址.参数pbos用于堆栈检测函数OSTaskStkChk().

271 * stk_size 指定任务堆栈的大小。其单位由OS_STK定义:当OS_STK的类型定义为INT8U、INT16U、

272 * INT32U的时候, stk_size的单位为分别为字节(8位)、字(16位)和双字(32位)。

274 * pext 是一个用户定义数据结构的指针,可作为TCB的扩展。例如,当任务切换时,用户定义

275 * 的数据结构中可存放浮点寄存器的数值,任务运行时间,任务切入次数等等信息。

277 * opt 存放与任务相关的操作信息。opt的低8位由uC/OS保留,用户不能使用。用户可以使用

278 * opt的高8位。每一种操作由opt中的一位或几位指定,当相应的位被置位时,表示选择

279 * 某种操作。当前的μC/OS版本支持下列操作:

280 * OS_TASK_OPT_STK_CHK:决定是否进行任务堆栈检查;

281 * OS_TASK_OPT_STK_CLR:决定是否清空堆栈;

282 * OS_TASK_OPT_SAVE_FP:决定是否保存浮点寄存器的数值。此项操作仅当处理器有浮

283 * 点硬件时有效。保存操作由硬件相关的代码完成。

286 * 返回: OS_NO_ERR:函数调用成功;

287 * OS_PRIO_EXIST:具有该优先级的任务已经存在;

288 * OS_PRIO_INVALID:参数指定的优先级大于OS_LOWEST_PRIO;

289 * OS_NO_MORE_TCB:系统中没有OS_TCB可以分配给任务了.

291 * 注意: 1、任务堆栈必须声明为OS_STK类型;

292 * 2、在任务中必须进行uC/OS提供的下述过程之一:延时等待、任务挂起、等待事件发生(等待

293 * 信号量,消息邮箱、消息队列),以使其他任务得到CPU;

294 * 3、用户程序中不能使用优先级0,1,2,3,以及OS_LOWEST_PRIO-3, OS_LOWEST_PRIO-2,

295 * OS_LOWEST_PRIO-1, OS_LOWEST_PRIO。这些优先级μC/OS系统保留,其余56个优先级提供给

296 * 应用程序.

297

******************************************************************************************/ 300 #if OS_TASK_CREATE_EXT_EN > 0 //允许生成OSTaskCreateExt()函数

301 INT8U OSTaskCreateExt (void (*task)(void *pd), //建立扩展任务(任务代码指针

302 void *pdata, //传递参数指针

303 OS_STK *ptos, //分配任务堆栈栈顶指针

304 INT8U prio, //分配任务优先级

305 INT16U id, //(未来的)优先级标识(与优先级相同)

306 OS_STK *pbos, //分配任务堆栈栈底指针

307 INT32U stk_size, //指定堆栈的容量(检验用)

308 void *pext, //指向用户附加的数据域的指针

309 INT16U opt) //建立任务设定选项)

1.4删除一个任务

358 /************************************************************************************* 360 * 删除一个指定优先级的任务(DELETE A TASK)

362 * 描述: 删除一个指定优先级的任务。任务可以传递自己的优先级给OSTaskDel(),从而删除自身.如果任务不知道自己的优先级,还可以传递参数OS_PRIO_SELF.被删除的任务将回到休眠状态.任务被删除后可以用函数OSTaskCreate()或OSTaskCreateExt()重新建立.

366 * 参数: prio 为指定要删除任务的优先级,也可以用参数OS_PRIO_SELF代替,此时,下一个优先级最高的就绪任务将开始运行。

369 * 返回: OS_NO_ERR:函数调用成功;

370 * OS_TASK_DEL_IDLE:错误操作,试图删除空闲任务(Idle task);

371 * OS_TASK_DEL_ ERR:错误操作,指定要删除的任务不存在;

372 * OS_PRIO_INVALID:参数指定的优先级大于OS_LOWEST_PRIO;

373 * OS_TASK_DEL_ISR:错误操作,试图在中断处理程序中删除任务.

376 * 注意: 1、OSTaskDel()将判断用户是否试图删除uC/OS中的空闲任务(Idle task);

377 * 2、在删除占用系统资源的任务时要小心,此时,为安全起见可以用另一个函数OSTaskDelReq().

******************************************************************************/

INT8U OSTaskDel (INT8U prio) //删除任务(任务的优先级)

1.5安全删除一个任务

471 /*************************************************************************************** 473 * 请求一个任务删除其它任务或自身(REQUEST THAT A TASK DELETE ITSELF)

474 *

475 * 描述: 请求一个任务删除自身。通常OSTaskDelReq()用于删除一个占有系统资源的任务(例如任务建立

476 * 了信号量)对于此类任务,在删除任务之前应当先释放任务占用的系统资源。

477 * 具体的做法是:在需要被删除的任务中调用OSTaskDelReq()检测是否有其他任务的删除请求,如478 * 果有,则释放自身占用的资源,然后调用OSTaskDel()删除自身。例如,假设任务5要删除任务10, 479 * 而任务10占有系统资源,此时任务5不能直接调用OSTaskDel(10)删除任务10,而应该调用

480 * OSTaskDelReq(10)向任务10发送删除请求.在任务10中调用OSTaskDelReq(OS_PRIO_SELF),并检测481 * 返回值。如果返回OS_TASK_DEL_REQ,则表明有来自其他任务的删除请求,此时任务10应该先释放482 * 资源,然后调用OSTaskDel(OS_PRIO_SELF)删除自己。任务5可以循环调用OSTaskDelReq(10)并检483 * 测返回值,如果返回OS_TASK_NOT_EXIST,表明任务10已经成功删除。

484 * void Task(void *data)

485 * {

486 * ...

487 * ...

488 * while (1) {

489 * OSTimeDly(1);

490 * if (OSTaskDelReq(OS_PRIO_SELF) == OS_TASK_DEL_REQ)

491 * {

492 * 释放任务占用的系统资源;

493 * 释放动态分配的内存;

494 * OSTaskDel(OS_PRIO_SELF);

495 * }

496 * }

497 * }

498 * 参数: prio 为要求删除任务的优先级。如果参数为OS_PRIO_SELF,则表示调用函数的任务正在查询499 * 是否有来自其他任务的删除请求。

500 *

501 * 返回: OS_NO_ERR:删除请求已经被任务记录;

502 * OS_TASK_NOT_EXIST:指定的任务不存在,发送删除请求的任务可以等待此返回值,看删除是否成功; 503 * OS_TASK_DEL_IDLE:错误操作,试图删除空闲任务(Idle task);

504 * OS_PRIO_INVALID:参数指定的优先级大于OS_LOWEST_PRIO或没有设定OS_PRIO_SELF的值;

505 * OS_TASK_DEL_REQ:当前任务收到来自其他任务的删除请求;

506 * 注意:OSTaskDelReq()将判断用户是否试图删除uC/OS中的空闲任务(Idle task)。

507

******************************************************************************************/ INT8U OSTaskDelReq (INT8U prio) //请求一个任务删除其它任务或自身?(任务的优先级)

1.6唤醒一个任务

549/**************************************************************************************** 551 * 唤醒一个用OSTaskSuspend()函数挂起的任务(RESUME A SUSPENDED TASK)

553 * 描述: 唤醒一个用OSTaskSuspend()函数挂起的任务。OSTaskResume()也是唯一能"解挂"挂起任务的函数。

555 * 参数: prio 指定要唤醒任务的优先级。

556 *

557 * 返回: OS_NO_ERR:函数调用成功;

558 * OS_TASK_RESUME_PRIO:要唤醒的任务不存在;

559 * OS_TASK_NOT_SUSPENDED:要唤醒的任务不在挂起状态;

560 * OS_PRIO_INVALID:参数指定的优先级大于或等于OS_LOWEST_PRIO。

561 **************************************************************************************** INT8U OSTaskResume (INT8U prio) //唤醒一个用OSTaskSuspend()函数挂起的任务(任务的优先级)

1.7检查任务堆栈状态

606 * 检查任务堆栈状态,计算指定任务堆栈中的未用空间和已用空间(STACK CHECKING)

608 * 描述: 检查任务堆栈状态,计算指定任务堆栈中的未用空间和已用空间。使用OSTaskStkChk()函数要求所检查的任务是被OSTaskCreateExt()函数建立的,且opt参数中OS_TASK_OPT_STK_CHK操作项打开。610 * //计算堆栈未用空间的方法是从堆栈底端向顶端逐个字节比较,检查堆栈中0的个数,直到一个非0的611 * 数值出现.这种方法的前提是堆栈建立时已经全部清零.要实现清零操作,需要在任务建立初始化

612 * 堆栈时设置OS_TASK_OPT_STK_CLR为1.如果应用程序在初始化时已经将全部RAM清零,且不进行任

613 * 务删除操作,也可以设置OS_TASK_OPT_STK_CLR为0,这将加快OSTaskCreateExt()函数的执行速度。615 * 参数: prio 为指定要获取堆栈信息的任务优先级,也可以指定参数OS_PRIO_SELF,获取调用任务本身的信息。

618 * pdata 指向一个类型为OS_STK_DATA的数据结构,其中包含如下信息:

619 * INT32U OSFree; // 堆栈中未使用的字节数

620 * INT32U OSUsed; // 堆栈中已使用的字节数

622 * 返回: OS_NO_ERR:函数调用成功;

623 * OS_PRIO_INVALID:参数指定的优先级大于OS_LOWEST_PRIO,或未指定OS_PRIO_SELF;

624 * OS_TASK_NOT_EXIST:指定的任务不存在;

625 * OS_TASK_OPT_ERR:任务用OSTaskCreateExt()函数建立的时候没有指定OS_TASK_OPT_STK_CHK 626 * 操作,或者任务是用OSTaskCreate()函数建立的。

628 * 注意: 1、函数的执行时间是由任务堆栈的大小决定的,事先不可预料;

629 * 2、在应用程序中可以把OS_STK_DATA结构中的数据项OSFree和OSUsed相加,可得到堆栈的大小; 630 * 3、虽然原则上该函数可以在中断程序中调用,但由于该函数可能执行很长时间,所以实际中不提631 * 倡这种做法。

632 **************************************************************************************/ 635 INT8U OSTaskStkChk (INT8U prio, OS_STK_DATA *pdata)

1.8挂起一个任务

/***************************************************************************************** 690 * 无条件挂起一个任务(SUSPEND A TASK)

691 *

692 * 描述: 无条件挂起一个任务. 调用此函数的任务也可以传递参数OS_PRIO_SELF,挂起调用任务本身. 693 * 当前任务挂起后,只有其他任务才能唤醒.任务挂起后,系统会重新进行任务调度,运行下一个

694 * 优先级最高的就绪任务.唤醒挂起任务需要调用函数OSTaskResume().

695 * //任务的挂起是可以叠加到其他操作上的。例如,任务被挂起时正在进行延时操作,那么任务的696 * 唤醒就需要两个条件:延时的结束以及其他任务的唤醒操作.又如,任务被挂起时正在等待信

697 * 号量,当任务从信号量的等待对列中清除后也不能立即运行,而必须等到唤醒操作后。

698 *

699 * 参数: prio 为指定要获取挂起的任务优先级,也可以指定参数OS_PRIO_SELF,挂起任务本身.此时, 700 * 下一个优先级最高的就绪任务将运行.

701 *

702 * 返回: OS_NO_ERR:函数调用成功;

703 * OS_TASK_ SUSPEND_IDLE:试图挂起uC/OS-II中的空闲任务(Idle task)。此为非法操作;

704 * OS_PRIO_INVALID:参数指定的优先级大于OS_LOWEST_PRIO或没有设定OS_PRIO_SELF的值;

705 * OS_TASK_ SUSPEND _PRIO:要挂起的任务不存在。

706 *

707 * 注意: 1、在程序中OSTaskSuspend()和OSTaskResume()应该成对使用;

708 * 2、用OSTaskSuspend()挂起的任务只能用OSTaskResume()唤醒.

709 *********************************************************************************/

713 INT8U OSTaskSuspend (INT8U prio) //无条件挂起一个任务(任务优先级

1.9获取任务信息

757 /*************************************************************************************** 759 * 获取任务信息,函数返回任务TCB的一个完整的拷贝(QUERY A TASK))

761 * 描述: 获取任务信息,函数返回任务TCB的一个完整的拷贝.应用程序必须建立一个OS_TCB类型的数

据结

762 * 构容纳返回的数据.需要提醒用户的是,在对任务OS_TCB对象中的数据操作时要小心,尤其是数据

763 * 项OSTCBNext和OSTCBPrev.它们分别指向TCB链表中的后一项和前一项.

764 *

765 * 参数: prio 为指定要获取TCB内容的任务优先级,也可以指定参数OS_PRIO_SELF,获取调用任务的信息.

766 * pdata指向一个OS_TCB类型的数据结构,容纳返回的任务TCB的一个拷贝.

767 *

768 * 返回: OS_NO_ERR:函数调用成功;

769 * OS_PRIO_ERR:参数指定的任务非法;

770 * OS_PRIO_INVALID:参数指定的优先级大于OS_LOWEST_PRIO.

771 * 注意: 任务控制块(TCB)中所包含的数据成员取决于下述开关量在初始化时的设定(参见OS_CFG.H) 772 * OS_TASK_CREATE_EN

773 * OS_Q_EN

774 * OS_MBOX_EN

775 * OS_SEM_EN

776 * OS_TASK_DEL_EN

777

***************************************************************************************** 781 INT8U OSTaskQuery (INT8U prio, OS_TCB *pdata) //获取任务信息(任务指针、保存数据结构指针)

二、时钟管理OS_TIME.C(API)

2.1、void OSTimeDly (INT16U ticks) //任务延时函数(时钟节拍数)

//将一个任务延时若干时间(设定时、分、秒、毫秒)

2.2、INT8U OSTimeDlyHMSM (INT8U hours, INT8U minutes, INT8U seconds, INT16U milli)

2.3、 INT8U OSTimeDlyResume (INT8U prio) //唤醒一个用OSTimeDly()或OSTimeDlyHMSM()函数的任务(优先级)

2.4、INT32U OSTimeGet (void) //获取当前系统时钟数值

2.5、void OSTimeSet (INT32U ticks) //设置当前系统时钟数值

2.1延时若干个时钟

16 /************************************************************************************** 18 * 将一个任务延时若干个时钟节拍(DELAY TASK 'n' TICKS (n from 0 to 65535))

20 * 描述: 将一个任务延时若干个时钟节拍。如果延时时间大于0, 系统将立即进行任务调度. 延时时间的长度可从0到65535个时钟节拍。延时时间0表示不进行延时,函数将立即返回调用者。延时的具体时间依赖于系统每秒钟有多少时钟节拍(由文件SO_CFG.H中的常量OS_TICKS_PER_SEC设定)。

附加:调用该函数会使uC/OS-ii进行一次任务调度,并且执行下一个优先级最高的就绪态任务。任务调用OSTimeDly()后,一旦规定的时间期满或者有其它的任务通过调用OSTimeDlyResume()取消了延时,它就会马上进入就绪状态。注意,只有当该任务在所有就绪任务中具有最高的优先级时,它才会立即运行。

28 * 参数: ticks 为要延时的时钟节拍数。(一个1 到65535之间的数)

30 * 返回: 无

31 * 注意: 注意到延时时间0表示不进行延时操作,而立即返回调用者. 为了确保设定的延时时间,建议用户设定的时钟节拍数加1。例如,希望延时10个时钟节拍,可设定参数为11。

33 *************************************************************************************/ 35 void OSTimeDly (INT16U ticks) //任务延时函数(时钟节拍数)

2.2长延时

/**************************************************************************************** 57 * 将一个任务延时若干时间(DELAY TASK FOR SPECIFIED TIME)

59 * 描述: 将一个任务延时若干时间。延时的单位是小时、分、秒、毫秒。所以使用OSTimeDlyHMSM()比OSTimeDly() 更方便。调用OSTimeDlyHMSM()后,如果延时时间不为0,系统将立即进行任务调度。

62 * 参数: hours 为延时小时数,范围从0-255. (max. is 255)

63 * minutes 为延时分钟数,范围从0-59. (max. 59)

64 * seconds 为延时秒数,范围从0-59. (max. 59)

65 * milli 为延时毫秒数,范围从0-999. (max. 999)

66 *需要说明的是,延时操作函数都是以时钟节拍为为单位的。实际的延时时间是时钟节拍的整数倍。例如系统每次时钟节拍间隔是10ms,如果设定延时为5ms,将不产生任何延时操作,而设定延时15ms,实际的延时是两个时钟节拍,也就是20ms。

70 * 附加:调用OSTimeDlyHMSM()函数也会使uC/OS-ii进行一次任务调度,并且执行下一个优先级最高的就绪态任务。

71 * 任务调用OSTimeDlyHMSM()后,一旦规定的时间期满或者有其它的任务通过调用OSTimeDlyResume()取消了延时(恢复延时的任务OSTimeDlyResume()),它就会马上处于就绪态。同样,只有当该任务在所有就绪态任务中具有最高的优先级时,它才会立即运行。

75 * 返回: OS_NO_ERR 函数调用成功;

76 * OS_TIME_INVALID_MINUTES 参数错误,分钟数大于59;

77 * OS_TIME_INVALID_SECONDS 参数错误,秒数大于59;

78 * OS_TIME_INVALID_MS 参数错误,毫秒数大于999;

79 * OS_TIME_ZERO_DLY 四个参数全为0.

81 * 注意: OSTimeDlyHMSM(0,0,0,0)表示不进行延时操作, 而立即返回调用者. 另外, 如果延时总时间超过65535个时钟节拍,将不能用OSTimeDlyResume()函数终止延时并唤醒任务。

83 **************************************************************************************/

//将一个任务延时若干时间(设定时、分、秒、毫秒)

87 INT8U OSTimeDlyHMSM (INT8U hours, INT8U minutes, INT8U seconds, INT16U milli)

2.3唤醒延时程序

/***************************************************************************************** 135 * 唤醒一个用OSTimeDly()或OSTimeDlyHMSM()函数延时的任务(RESUME A DELAYED TASK)

137 * 描述: 唤醒一个用OSTimeDly()或OSTimeDlyHMSM()函数延时的任务

138 * OSTimeDlyResume()函数不能唤醒一个用OSTimeDlyHMSM()延时,且延时时间总计超过65535个时钟节拍的任务。例如,如果系统时钟为100Hz,OSTimeDlyResume()不能唤醒延时OSTimeDlyHMSM(0,10,55,350) 或更长时间的任务。

141 * (OSTimeDlyHMSM(0,10,55,350)共延时[10 minutes * 60 + (55+0.35)seconds ] * 100 = 65,535次时钟节拍---译者注)

144 * 参数: prio 为指定要唤醒任务的优先级

146 * 返回: OS_NO_ERR 函数调用成功

147 * OS_PRIO_INVALID 参数指定的优先级大于OS_LOWEST_PRIO

148 * OS_TIME_NOT_DLY 要唤醒的任务不在延时状态

149 * OS_TASK_NOT_EXIST 指定的任务不存在

151 * 注意:用户不应该用OSTimeDlyResume()去唤醒一个设置了等待超时操作,并且正在等待事件发生的任务。操作的结果是使该任务结束等待,除非的确希望这么做。

****************************************************************************************** 154 * uC/OS-ii允许用户结束延时正处于延时期的任务。延时的任务可以不等待延时期满,而是通过其它任务取消延时来使自己处于就绪态。这可以通过调用OSTimeDlyResume()和指定要恢复的任务的优先级来完成。实际上,OSTimeDlyResume()也可以唤醒正在等待事件(参看任务间的通讯和同步)的任务,虽然这一点并没有提到过。在这种情况下,等待事件发生的任务会考虑是否终止等待事件。

158 * OSTimeDlyResume()的代码如程序,它首先要确保指定的任务优先级有效。接着,OSTimeDlyResume()要确认要结束延时的任务是确实存在的。如果任务存在,OSTimeDlyResume()会检验任务是否在等待延时期满。只要OS_TCB域中的OSTCBDly包含非0值就表明任务正在等待延时期满,因为任务调用了OSTimeDly(),161 * OSTimeDlyHMSM()或其它在第六章中所描述的PEND函数。然后延时就可以通过强制命令OSTCBDly为0来取消延时的任务有可能已被挂起了,这样的话,任务只有在没有被挂起的情况下才能处于就绪状态。当上面的条件都满足后,任务就会被放在就绪表中。这时,OSTimeDlyResume()会调用任务调度程序来看被恢复的任务是否拥有比当前任务更高的优先级。这会导致任务的切换。

165 ************************************************************************************/ 169 INT8U OSTimeDlyResume (INT8U prio) //唤醒一个用OSTimeDly()或OSTimeDlyHMSM()函数的任务(优先级)

2.4获取当前系统时钟数值

****************************************************************************************

211 * 获取当前系统时钟数值(GET CURRENT SYSTEM TIME)

213 * 描述: 获取当前系统时钟数值。系统时钟是一个32位的计数器,记录系统上电后或时钟重新设置后的时钟计数。附加:无论时钟节拍何时发生,uC/OS-ii都会将一个32位的计数器加1。这个计数器在用户调用OSStart()初始化多任务和4,294,967,295个节拍执行完一遍的时候从0开始计数。在时钟节拍的频率等于100Hz的时候,这个32位的计数器每隔497天就重新开始计数。用户可以通过调用OSTimeGet()来获得该计数器的当前值。也可以通过调用OSTimeSet()来改变该计数器的值。OSTimeGet()和OSTimeSet()两个函数的代码如程序。

219 * 注意,在访问OSTime的时候中断是关掉的。这是因为在大多数8位处理器上增加和拷贝一个32位的数都需要数条指令,这些指令一般都需要一次执行完毕,而不能被中断等因素打断

222 * 参数: 无

224 * 返回: 当前时钟计数(时钟节拍数)

*****************************************************************************************/ INT32U OSTimeGet (void) //获取当前系统时钟数值

2.5设置当前系统时钟数值

244 /************************************************************************************ 246 * 设置当前系统时钟数值(SET SYSTEM CLOCK)

248 * 描述: 设置当前系统时钟数值。系统时钟是一个32位的计数器, 记录系统上电后或时钟重新设置后的时钟计数.

250 * 参数: ticks 要设置的时钟数,单位是时钟节拍数.

252 * 返回: 无

****************************************************************************************/ 257 void OSTimeSet (INT32U ticks) //设置当前系统时钟数值

三、信号量OS_SEM.C(API)

3.1请求一个信号量

19 /*************************************************************************************

20 * 无条件地等待请求一个信号量

22 * 描述: 该函数是查看资源是否使用或事件是否发生。中断调用该函数查询信号量。

23 * 不同于OSSemPend()函数,如果资源不可使用,OSSemAccept()函数并不挂起任务。

25 * 参数: pevent 指向需要保护地共享资源地信号量。当建立信号量时,用户得到该指针

27 * 返回: 当调用OSSemAccept()函数时;

28 共享资源信号量的值 > 0,则说明共享资源可以使用,这个值被返回调用者,信号量的值减1;

29 共享资源信号量的值 = 0,则说明资源不能使用,返回0。

30 ***********************************************************************************/

34 INT16U OSSemAccept (OS_EVENT *pevent) //无条件地等待请求一个信号量函数

3.2建立一个信号量

/*******************************************************************************************

64 * 描述: 建立并初始化一个信号量。信号量的作用为:

65 * 1、允许一个任务与其它任务或中断同步;

66 * 2、取得共享资源的使用权;

67 * 3、标志事件的发生

69 * 参数: cnt 建立信号量的初始值,可以为0 ~ 65 535的任何值

71 * 注意:必须先建立信号量,然后才能使用

73 * 返回: != (void *)0 返回指向分配给所建立的消息邮箱的事件控制块指针;

74 * == (void *)0 如果没有可用的事件控制块,返回空指针

****************************************************************************************** 78 OS_EVENT *OSSemCreate (INT16U cnt) //建立并初始化一个信号量(输入一个信号量值)

3.3删除一个信号量

104 /********************************************************************************

107 * 描述: 用于删除一个信号量。

108 * 使用本函数有风险,因为多任务中的其它任务可能还想使用这个信号量,必须特别小心。

109 * 一般而言,在删除信号量之前,应该先删除所有可能会用到的这个信号量的任务。

111 * 参数: pevent 指向信号量指针。该指针的值在建立该信号量时得到。(参见OSSemCreate ()函数) 113 * opt 该选项定义信号量的删除条件。可以选择只能在已经没有任何任务在等待该信号量时,才

114 * 能删除该信号量(OS_DEL_NO_PEND);或者,不管有没有任务在等待该信号量,立即删除该

115 * 信号量(OS_DEL_ALWAYS),在这种情况下,所有等待该信号量的任务都立即进入就绪态

117 * err 指向包含错误码的变量的指针。返回的错误码可能为以下几种:

118 * OS_NO_ERR 调用成功,信号量已被删除;

119 * OS_ERR_DEL_ISR 试图在中断服务子程序中删除信号量;

120 * OS_ERR_INVALID_OPT 没有将opt参数定义为2种合法的参数之一;

121 * OS_ERR_TASK_WAITING 有一个或一个以上的任务在等待信号量;

122 * OS_ERR_EVENT_TYPE pevent不是指向信号量的指针;

123 * OS_ERR_PEVENT_NULL 已经没有可用的OS_EVENT数据结构了。

125 * 返回: pevent 如果信号量已被删除,返回空指针;

126 * 若信号量没有删除,则返回pevent(信号量指针),可查看出错代码。

128 * 注意: 1) 使用此函数必须特别小心,因为多任务中的其它任务可能还想使用这个信号量;

129 2)当挂起的任务进入就绪态时,中断是关闭的,这意味着中断延迟时间与等待信号量的任务数有关。*****************************************************************************************/ 134 OS_EVENT *OSSemDel (OS_EVENT *pevent, INT8U opt, INT8U *err)

//删除一个信号量(信号指针、删除条件、错误指针)

3.4等待一个信号量

/******************************************************************************************* 203 * 描述: 等待一个信号量。

204 * 任务试图取得共享资源使用权、任务需要与其它任务或中断同步及任务需要等待特定事件的发生的场合。

205 * 若任务调用该函数,且信号量的值>0,那么OSSemPend()递减该值并返回该值;

206 * 若任务调用该函数,且信号量的值=0,那么OSSemPend()函数将任务加入该信号量的等待列表中。208 * 参数: pevent 指向信号量指针。该指针的值在建立该信号量时得到。(参见OSSemCreate ()函数) 210 * timeout 允许任务在经过指定数目的时钟节拍后还没有得到需要的信号量时;恢复运行状态。如果211 * 该值为0。则表示任务将持续地等待信号量。最长等待时间为65 535个时钟节拍。这个时间长度并不是严格的,可能存在一个时间节拍的误差,因为自由一个时钟节拍结束后,才会给定义的等待超时时钟节拍减1。

214 * err 指向包含错误码的变量的指针。返回的错误码可能为以下几种;

216 * OS_NO_ERR 成功,信号量是可用的;

217 * OS_TIMEOUT 信号量没有在指定的周期数内置位;

218 * OS_ERR_EVENT_TYPE pevent不是指向信号量的指针;

219 * OS_ERR_PEND_ISR 在中断中调用该函数。虽然规定了不允许在中断中调用该函数,但

220 * ucos仍然包含了检测这种情况的功能;

221 * OS_ERR_PEVENT_NULL pevent是空指针。

222 * 返回: 无

223 * 注意:必须先建立信号量,然后才能使用。

*****************************************************************************************/ 226 //等待一个信号量函数(信号量指针、允许等待的时钟节拍、代码错误指针)

227 void OSSemPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)

3.5发出一个信号量

/**************************************************************************************** 277 * 描述: 置位指定的信号量。如果指定的信号量是0或大于0,该函数则递增该信号量并返回;

278 如果有任何任务在等待信号量,那么最高优先级任务将得到该信号量并进入就绪态;

279 如果被唤醒的任务就是最高优先级的就绪态任务,则任务调度函数将进入任务调度。

281 * 参数: pevent 指向信号量指针。该指针的值在建立该信号量时得到。(参见OSSemCreate ()函数) 283 * 返回: OS_NO_ERR 信号量成功的置位;

284 * OS_SEM_OVF 信号量的值溢出;

285 * OS_ERR_EVENT_TYPE pevent不是指向信号量的指针;

286 * OS_ERR_PEVENT_NULL pevent是空指针。

*******************************************************************************************/ 290 INT8U OSSemPost (OS_EVENT *pevent) //发出一个信号量函数(信号量指针)

3.6查询一个信号量的当前状态

/**************************************************************************************** 324 * 描述: 用于获取某个信号量的信息。在使用该函数之前,应用程序先要建立OS_SEM_DATA的数据结构,用来保存从信号量的事件控制中取得的数据。使用该函数可以得知,是否有以及多少任务目前位于信号量的任务等待对列中(查询OSEventTbl()域中的数目),并还可以获取信号量的值。

328 * 参数: pevent 指向信号量指针。该指针的值在建立该信号量时得到。(参见OSSemCreate ()函数) 329 *

330 * pdata 一个指向数据结构OS_SEM_DATA的指针。

331 *

332 * 返回: OS_NO_ERR 用成功;

333 * OS_ERR_EVENT_TYPE pevent不是指向信号量的指针;

334 * OS_ERR_PEVENT_NULL pevent是空指针。

******************************************************************************************/ 339 INT8U OSSemQuery (OS_EVENT *pevent, OS_SEM_DATA *pdata)

340 { //查询一个信号量的当前状态(信号量指针、状态数据结构指针)

OS_CFG.H 说明

19 #define OS_MAX_EVENTS 2 /* 应用中最多事件控制块的数目, 必须大于 0*/

21 #define OS_MAX_FLAGS 5 /* 应用中最多事件标志组的数目, 必须大于 0*/

23 #define OS_MAX_MEM_PART 5 /* 最多内存块的数目, 必须大于 0*/

25 #define OS_MAX_QS 2 /* 应用中最多对列控制块的数目, 必须大于 0*/

27 #define OS_MAX_TASKS 11 /* 应用中最多任务数目, 必须大于等于2*/

30 #define OS_LOWEST_PRIO 12 /* 定义任务的最低优先级,不得大于 63 !*/

33 #define OS_TASK_IDLE_STK_SIZE 512 /* 统计任务堆栈容量( # 按照OS_STK的宽度数目) */

35 #define OS_TASK_STAT_EN 1 /* 允许 (1) 或者禁止 (0) 统计任务 */

36 #define OS_TASK_STAT_STK_SIZE 512 /* 空闲任务堆栈容量 (#按照OS_STK的宽度数目) */

38 #define OS_ARG_CHK_EN 1 /* 允许 (1) 或者禁止 (0) 变量检查 */

39 #define OS_CPU_HOOKS_EN 1 /* 在处理器移植文件中允许使用 uC/OS-II 的接口函数 */

42 /* -------------------事件标志管理 ------------------- */

43 #define OS_FLAG_EN 1 /* 允许 (1) 或者禁止 (0) 产生事件标志相关代码 */

44 #define OS_FLAG_WAIT_CLR_EN 1 /* 允许生成 Wait on Clear 事件标志代码 */

45 #define OS_FLAG_ACCEPT_EN 1 /* 允许生成 OSFlagAccept() */

46 #define OS_FLAG_DEL_EN 1 /* 允许生成 OSFlagDel() */

47 #define OS_FLAG_QUERY_EN 1 /* 允许生成 OSFlagQuery() */

50 /* -------------------消息邮箱管理 -------- ---------- */

51 #define OS_MBOX_EN 1 /* 允许 (1) 或者禁止 (0) 产生消息邮箱相关代码 */

52 #define OS_MBOX_ACCEPT_EN 1 /* 允许生成 OSMboxAccept() */

53 #define OS_MBOX_DEL_EN 1 /* 允许生成 OSMboxDel() */

54 #define OS_MBOX_POST_EN 1 /* 允许生成 OSMboxPost() */

55 #define OS_MBOX_POST_OPT_EN 1 /* 允许生成 OSMboxPostOpt() */

56 #define OS_MBOX_QUERY_EN 1 /* 允许生成 OSMboxQuery() */

57

58

59 /* ---------------------内存管理 --------------------- */

60 #define OS_MEM_EN 1 /* 允许 (1) 或者禁止 (0) 产生内存相关代码 */

61 #define OS_MEM_QUERY_EN 1 /* 允许生成 OSMemQuery() */

62

63

64 /* ---------------- 互斥型信号量管理 ----------------- */

65 #define OS_MUTEX_EN 1 /* 允许 (1) 或者禁止 (0) 产生互斥型信号量相关代码 */

66 #define OS_MUTEX_ACCEPT_EN 1 /* 允许生成 OSMutexAccept() */

67 #define OS_MUTEX_DEL_EN 1 /* 允许生成 OSMutexDel() */

68 #define OS_MUTEX_QUERY_EN 1 /* 允许生成 OSMutexQuery() */

69

70

71 /* -------------------消息队列号管理 ----------------- */

72 #define OS_Q_EN 1 /* 允许 (1) 或者禁止 (0) 产生消息队列相关代码 */

73 #define OS_Q_ACCEPT_EN 1 /* 允许生成 OSQAccept() */

74 #define OS_Q_DEL_EN 1 /* 允许生成 OSQDel() */

75 #define OS_Q_FLUSH_EN 1 /* 允许生成 OSQFlush() */

76 #define OS_Q_POST_EN 1 /* 允许生成 OSQPost() */

77 #define OS_Q_POST_FRONT_EN 1 /* 允许生成 OSQPostFront() */

78 #define OS_Q_POST_OPT_EN 1 /* 允许生成 OSQPostOpt() */

79 #define OS_Q_QUERY_EN 1 /* 允许生成 OSQQuery() */

80

81

82 /* ---------------------信号管理 --------------------- */

83 #define OS_SEM_EN 1 /* 允许 (1) 或者禁止 (0) 产生信号量相关代码 */

84 #define OS_SEM_ACCEPT_EN 1 /* 允许生成 OSSemAccept() */

85 #define OS_SEM_DEL_EN 1 /* 允许生成 OSSemDel() */

86 #define OS_SEM_QUERY_EN 1 /* 允许生成 OSSemQuery() */

87

88

89 /* -------------------任务管理 ----------------------- */

90 #define OS_TASK_CHANGE_PRIO_EN 1 /* 允许生成 OSTaskChangePrio() 函数代码 */

91 #define OS_TASK_CREATE_EN 1 /* 允许生成 OSTaskCreate() 函数代码 */

92 #define OS_TASK_CREATE_EXT_EN 1 /* 允许生成 OSTaskCreateExt() 函数代码 */

93 #define OS_TASK_DEL_EN 1 /* 允许生成 OSTaskDel() 函数代码 */

94 #define OS_TASK_SUSPEND_EN 1 /* 允许生成 OSTaskSuspend() and OSTaskResume() 函数代码*/

95 #define OS_TASK_QUERY_EN 1 /* 允许生成 OSTaskQuery() 函数代码 */

96

97

98 /* ----------------------时间管理 -------------------- */

99 #define OS_TIME_DLY_HMSM_EN 1 /* 允许生成OSTimeDlyHMSM() 函数代码 */

100 #define OS_TIME_DLY_RESUME_EN 1 /* 允许生成OSTimeDlyResume() 函数代码 */

101 #define OS_TIME_GET_SET_EN 1 /* 允许生成 OSTimeGet() 和 OSTimeSet() 函数代码 */

102

103

104 /* -------------------- 混合管理 --------------------- */

105 #define OS_SCHED_LOCK_EN 1 /* 允许生成 OSSchedLock() 和 OSSchedUnlock() 代码 */

106

107

108 #define OS_TICKS_PER_SEC 200 /* 设置每秒的节拍数目 */

109

110

111 typedef INT16U OS_FLAGS; /* 事件标志的数据类型 (8位, 16位或 32 位) */

112

113 /**********************************结束*****************************************/

常用数据库对比

常用数据库对比 目前,常用于OLAP分析的数据库软件有Oracle、DB2、Teradata、Greenplum、Netezza、Exdata 几种。 1、Oracle 提起数据库,第一个想到的公司,一般都会是Oracle(甲骨文)。该公司成立于1977年,最初是一家专门开发数据库的公司。Oracle在数据库领域一直处于领先地位。1984年,首先将关系数据库转到了桌面计算机上。然后,Oracle5率先推出了分布式数据库、客户/服务器结构等崭新的概念。Oracle 6首创行锁定模式以及对称多处理计算机的支持……最新的Oracle 8主要增加了对象技术,成为关系—对象数据库系统。目前,Oracle产品覆盖了大、中、小型机等几十种机型,Oracle数据库成为世界上使用最广泛的关系数据系统之一。

2、DB2 DB2是IBM公司的产品,起源于System R和System R*。他支持从PC到UNIX,从中小型机到大型机;从IBM到非IBM(HP及SUN UNIX系统等)各种操作平台。他既可以在主机上以主/从方式独立运行,也可以在客户/服务器环境中运行。其中服务平台可以是OS/400,AIX,OS/2,HP-UNIX,SUN-Solaris等操作系统,客户机平台可以是OS/2或Windows, Dos, AIX, HP-UX, SUN Solaris等操作系统。

3、Greenplum Greenplum的架构采用了MPP(大规模并行处理),公司专注于OLAP系统数据引擎开发,有世界级的研发团队进行高性能计算和数据库系统的前沿开发工作,宗旨是向客户提供高性能的超级数据引擎,并将强大的并行计算能力融入到大规模数据仓库分析领域中。公司具有发展趋势超前的视野和洞察力,为全球很多最大规模的数据仓库提供推动力;公司最先将SQL 和Map Reduce的功能整合到统一的数据处理框架中。

驱动程序

linux 驱动程序设计实验 一实验目的 1.了解LINUX操作系统中的设备驱动程序的组成 2.编写简单的字符设备驱动程序并进行测试 3.编写简单的块设备驱动程序并进行测试 4.理解LINUX操作系统的设备管理机制 二准备知识 1. LINUX下驱动程序基础知识 Linux抽象了对硬件的处理,所有的硬件设备都可以像普通文件一样来看待:它们可以使用和操作文件相同的、标准的系统调用接口来完成打开、关闭、读写和I/O控制操作,而驱动程序的主要任务也就是要实现这些系统调用函数。在Linux操作系统下有两类主要的设备文件:一类是字符设备,另一类则是块设备。字符设备是以字节为单位逐个进行I/O操作的设备,在对字符设备发出读写请求时,实际的硬件I/O紧接着就发生了,一般来说字符设备中的缓存是可有可无的,而且也不支持随机访问。块设备则是利用一块系统内存作为缓冲区,当用户进程对设备进行读写请求时,驱动程序先查看缓冲区中的内容,如果缓冲区中的数据能满足用户的要求就返回相应的数据,否则就调用相应的请求函数来进行实际的I/O操作。块设备主要是针对磁盘等慢速设备设计的,其目的是避免耗费过多的CPU时间来等待操作的完成。一般说来,PCI卡通常都属于字符设备。 我们常见的驱动程序就是作为内核模块动态加载的,比如声卡驱动和网卡驱动等,这些驱动程序源码可以修改到内核中,也可以把他们编译成模块形势,在需要的时候动态加载. 而Linux最基础的驱动,如CPU、PCI总线、TCP/IP协议、APM (高级电源管理)、VFS等驱动程序则编译在内核文件中。有时也把内核模块就叫做驱动程序,只不过驱动的内容不一定是硬件罢了,比如ext3文件系统的驱动。当我们加载了设备驱动模块后,应该怎样访问这些设备呢?Linux是一种类Unix系统,Unix的一个基本特点是“一切皆为文件”,它抽象了设备的处理,将所有的硬件设备都像普通文件一样看待,也就是说硬件可以跟普通文件一样来打开、关闭和读写。 系统中的设备都用一个设备特殊文件代表,叫做设备文件,设备文件又分为Block (块)型设备文件、Character(字符)型设备文件和Socket (网络插件)型设备文件。Block设备文件常常指定哪些需要以块(如512字节)的方式写入的设备,比如IDE硬盘、SCSI硬盘、光驱等。而Character型设备文件常指定直接读写,没有缓冲区的设备,比如并口、虚拟控制台等。Socket(网络插件)型设备文件指定的是网络设备访问的BSD socket 接口。 设备文件都放在/dev目录下,比如硬盘就是用/dev/hd*来表示,/dev/hda表示第一个IDE 接口的主设备,/dev/hda1表示第一个硬盘上的第一个分区;而/dev/hdc 表示第二个IDE接口的主设备。对于Block和Character型设备,使用主(Major)和辅(minor)设备编号来描述设备。主设备编号来表示某种驱动程序,同一个设备驱动程序模块所控制的所有设备都有一

Delphi Api

auxGetDevCaps API 获取附属设备容量 auxGetNumDevs API 返回附属设备数量 auxGetVolume API 获取当前卷设置 auxOutMessage API 向输出设备发送消息 auxSetVolume API 设置附属设备卷 AbortDoc API 终止一项打印作业 AbortPath API 终止或取消DC中的一切路径 AbortPrinter API 删除打印机缓冲文件AbortSystemShutdown API 停止系统工作 AccessCheck API 检验客户访问权限AccessCheckAndAuditAlarm API 检验访问,产生声音或警报ActivateKeyboardLayout API 激活一个新的键盘设备AddAccessAllowedAce API 将ACCESS_ALLOWED_ACE加入ACL AddAccessDeniedAce API 将ACCESS_DENIED_ACE加入ACL AddAce API 将ACE加入一个已存在的ACL AddAtom API 将一个字符串加入本地原子表AddAuditAccessAce API 将SYSTEM_AUDIT_ACE加入ACL AddFontResource API 将一种字体加入字体表 AddForm API 加入一个打印机窗体 AddJob API 启动一个打印作业 AddMonitor API 加入一个打印机管理器 AddPort API 加入一个打印机端口 AddPrintProcessor API 将打印处理器复制到打印机服务器中AddPrintProvidor API 加入一个打印机支持器 AddPrinter API 在打印机服务器上建立一个打印机AddPrinterConnection API 为当前用户建立与打印机的联系AddPrinterDriver API 将打印机驱动程序复制到打印机服务器中AdjustTokenGroups API 使能/取消令牌中的群AdjustTokenPrivileges API 使能/取消令牌特权AdjustWindowRect API 计算所需窗口矩形的大小AdjustWindowRectEx API 计算所需窗口矩形的大小AdvancedDocumentProperties API 进行打印机高级设置AllocConsole API 为当前进程建立控制台AllocateAndInitializeSid API 分配和初始化SID AllocateLocallyUniqueId API 分配LUID AngleArc API 按指定角度画弧 AnimatePalette API 替换逻辑调色板中的项目 AnyPopup API 标识弹出式窗口是否存在 AppendMenu API 在菜单中加入新的项目 Arc API 画弧 ArcTo API 画椭圆弧 AreAllAccessesGranted API 检查所有要求的访问AreAnyAccessesGranted API 检查任何要求的访问ArrangeIconicWindows API 排列最小化的子窗口

驱动入口函数

这个驱动程序包含了三个函数:DriverEntry、HelloDDKUnload和HelloDDKDispatchRoutine。其中DriverEntry是驱动程序的入口函数,相当于C/C++程序的main函数,HelloDDKUnload函数是驱动卸载函数。而HelloDDKDispatchRuntine则是IRP的派遣函数,因为驱动程序主要是处理IO 请求,而IO请求大多是在派遣函数中处理的。 先来看看这个驱动程序的第一个函数:DriverEntry /**************************************************************** * 函数名称:DriverEntry * 功能描述:初始化驱动程序,定位和申请硬件资源,创建内核对象 * 参数列表: pDriverObject:从I/O管理器中传来的驱动对象 pRegistryPath:驱动程序在注册表中的路径 * 返回值:返回初始化驱动状态 ****************************************************************/ #pragma INITCODE extern "C" NTSTATUS DriverEntry( IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath ) { NTSTATUS status; KdPrint( ( "Enter DriverEntry!\n" ) ); //注册其它驱动调用函数入口 pDriverObject->DriverUnload = ( PDRIVER_UNLOAD ) HelloDDKUnload; pDriverObject->MajorFunction[IRP_MJ_CREATE] = HelloDDKDispatchRoutine; pDriverObject->MajorFunction[IRP_MJ_CLOSE] = HelloDDKDispatchRoutine; pDriverObject->MajorFunction[IRP_MJ_WRITE] = HelloDDKDispatchRoutine; pDriverObject->MajorFunction[IRP_MJ_READ] = HelloDDKDispatchRoutine; //创建驱动设备对象 status = CreateDeivce( pDriverObject ); KdPrint( ( "DriverEntry end!\n" ) ); return status; } 这个函数的第一句代码是一个#pragma预处理指令: #pragma INITCODE

DELPHI常用组件

Delphi常用组件的使用 目录 1.按钮类组件 1.1Button组件

Button组件位于Standard页。 Button组件的常用属性表 属性描述 Cation用于在按钮上显示文本内容 Cancel用来指定按钮是否为取消按钮 Default用于指定按钮是否为默认按钮,在按Enter键时也选中命令按钮Hint设置鼠标在组件上短暂停时在组件旁显示的提示小窗口的内容ShowHint确定是否显示提示文本,默认值是FALSE 1.2Bitbtn组件 Bitbtn组件(位图组件)位于Additional,与Button很相似,只是多了一个位图符号在按钮上(如带有对号的OK,问好的Help等),其某些属性与Button类似,下表为其独有的的特性。(注:此组件不需编写代码) Bitbtn组件的常用属性表 属性描述 Kind Kind属性的值就是位图按钮上显示的图标。Kind属性后的下拉列表中有一组默认图标的属性值,有bkCancel(取消)、bkAbort(终止)、bkAll(所有)、 bkClose(关闭)等。 Glyph用于在位图按钮上显示加载后的位图图形 NumGlyphs用于指明位图按钮所能使用位图的个数。在delphi中,最多允许向一个位图按钮提供4个图像文件,用于表示4中不停状态 Layout用于指出位图图形在位图组件上的放置位置 1.3SpeedButton组件 SpeedButton组件(加速按钮)位于Additional,常放置在Panel组件上,用于设计工具栏。它与Bitbtn相似,也可以显示图像和文本,但通常只用于显示图像。 SpeedButton组件的常用属性表 属性描述 AllowAllUp用于设置同一组的加速按钮是否具有同时弹起的状态。若设置为FALSE,则当同一组加速按钮中的一个被按下时,其他加速按钮都处于弹起状态,即这 组按钮必须有且只有一个处于按下状态 Down用于设置该加速按钮是否处于按下状态,若设置为TRUE,则表示按钮处于按下状态 Flat用于设置在鼠标移动到该按钮上时,按钮是否显示三维效果。为FLASE则不出现 GroupIndex用于将数个加速按钮设置成一组,只需将其值设置成不等于0的数值即可1.4RadioButton组件

整理的SQL常用函数

create table test (id int, value varchar(10)) insertinto test values('1','aa') insertinto test values('1','bb') insertinto test values('2','aaa') insertinto test values('2','bbb') insertinto test values('2','ccc') insertinto test values('3','aa') insertinto test values('4','bb') select*from test select id, [values] =stuff((select','+ [values] from test t where id = test.id forxmlpath('')), 1 , 1 ,'') from test groupby id stuff(param1,startIndex,length, param2) 说明:将param1中自startIndex(SQL中都是从1开始,而非0)起,删除length个字符,然后用param2替换删掉的字符。*/

COUNT()函数用于返回一个列内所有非空值的个数,这是一个整型值。 由于COUNT(*)函数会忽略NULL值,所以这个查询的结果是2。 三、SUM()函数 SUM()函数是最常用的聚合函数之一,它的功能很容易理解:和AVG()函数一样,它用于数值数据类型,返回一个列范围内所有非空值的总和。 四、CAST()函数 CAST()函数的参数是一个表达式,它包括用AS关键字分隔的源值和目标数据类型。 以下例子用于将文本字符串'123'转换为整型: SELECT CAST('123' AS int) 返回值是整型值123。 如果试图将一个代表小数的字符串转换为整型值,又会出现什么情况呢? SELECT CAST('123.4' AS int) CAST()函数和CONVERT()函数都不能执行四舍五入或截断操作。由于123.4不能用int数据类型来表示,所以对这个函数调用将产生一个错误。 Server: Msg 245, Level 16, State 1, Line 1 Syntax error converting the varchar value '123.4' to a column of data type int. 在将varchar值'123.4' 转换成数据类型int时失败。 要返回一个合法的数值,就必须使用能处理这个值的数据类型。对于这个例子,存在多个可用的数据类型。如果通过CAST()函数将这个值转换为decimal类型,需要首先定义decimal 值的精度与小数位数。在本例中,精度与小数位数分别为9与2。精度是总的数字位数,包括小数点左边和右边位数的总和。而小数位数是小数点右边的位数。这表示本例能够支持的最大的整数值是9999999,而最小的小数是0.01。 SELECT CAST('123.4' AS decimal(9,2)) decimal数据类型在结果网格中将显示有效小数位:123.40 精度和小数位数的默认值分别是18与0。如果在decimal类型中不提供这两个值,SQL Server 将截断数字的小数部分,而不会产生错误。 SELECT CAST('123.4' AS decimal) 结果是一个整数值:123 五、CONVERT()函数 对于简单类型转换,CONVERT()函数和CAST()函数的功能相同,只是语法不同。 CAST()函数一般更容易使用,其功能也更简单。 CONVERT()函数的优点是可以格式化日期和数值,它需要两个参数:第1个是目标数据类型,第2个是源数据。 CONVERT()函数还具有一些改进的功能,它可以返回经过格式化的字符串值,且可以把日期值格式化成很多形式。有28种预定义的符合各种国际和特殊要求的日期与时间输出格式。 六、STR()函数 这是一个将数字转换为字符串的快捷函数。这个函数有3个参数:数值、总长度和小数位数。如果数字的整数位数和小数位数(要加上小数点占用的一个字符)的总和小于总长度,对结果中左边的字符将用空格填充。在下面第1个例子中,包括小数点在内一共是5个字符。结果

字符设备驱动相关函数及数据结构简介

1.设备号 分为主次设备号,看上去像是两个号码,但在内核中用dev_t()一种结构表示,同时不应该自己去假设赋值设备号,而是使用宏()来取得. MAJOR(dev_t dev); MINOR(dev_t dev); 即使你有确定的主,次设备号也要用 dev=MKDEV(int major, int minor); 1.1分配设备号 静态分配 int register_chrdev_region(dev_t first, unsigned int count, char *name); first 是你要分配的起始设备编号. first 的次编号部分常常是0, 但是没有要求是那个效果. count 是你请求的连续设备编号的总数. 注意, 如果count 太大, 你要求的范围可能溢出到下一个次编号; 但是只要你要求的编号范围可用, 一切都仍然会正确工作. name 是应当连接到这个编号范围的设备的名子; 它会出现在/proc/devices 和sysfs 中 动态分配 int alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned int count, char *name); dev 是一个只输出的参数, 它在函数成功完成时持有你的分配范围的第一个数. fisetminor 应当是请求的第一个要用的次编号; 它常常是0. count 和name 参数如同给request_chrdev_region 的一样 >>>应该始终使用动态分配,但最好为定制设备号留有接口,以参数形式,以name_major=0做为默认值,可能 的操作如下: if(scull_major){ dev = MKDEV(scull_major, scull_minor); result = register_chrdev_region(dev, scull_nr_devs,"scull"); }else{ result = alloc_chrdev_region(&dev, scull_minor, scull_nr_devs,"scull"); scull_major = MAJOR(dev); } if(result < 0){ printk(KERN_WARNING "scull: can't get major %d\n", scull_major); return result; } 1.2释放设备号 void unregister_chrdev_region(dev_t first, unsigned int count);

(DELPHI)API函数大全

(DELPHI)API函数大全 1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接WNetAddConnection2 创建同一个网络资源的连接WNetAddConnection3 创建同一个网络资源的连接WNetCancelConnection 结束一个网络连接 WNetCancelConnection2 结束一个网络连接 WNetCloseEnum 结束一次枚举操作 WNetConnectionDialog 启动一个标准对话框,以便建立同网络资源的连接WNetDisconnectDialog 启动一个标准对话框,以便断开同网络资源的连接WNetEnumResource 枚举网络资源 WNetGetConnection 获取本地或已连接的一个资源的网络名称WNetGetLastError 获取网络错误的扩展错误信息WNetGetUniversalName 获取网络中一个文件的远程名称以及/或者UNC (统一命名规范)名称 WNetGetUser 获取一个网络资源用以连接的名字 WNetOpenEnum 启动对网络资源进行枚举的过程 2. API之消息函数 BroadcastSystemMessage 将一条系统消息广播给系统中所有的顶级窗口GetMessagePos 取得消息队列中上一条消息处理完毕时的鼠标指针屏幕位置GetMessageTime 取得消息队列中上一条消息处理完毕时的时间PostMessage 将一条消息投递到指定窗口的消息队列PostThreadMessage 将一条消息投递给应用程序RegisterWindowMessage 获取分配给一个字串标识符的消息编号ReplyMessage 答复一个消息 SendMessage 调用一个窗口的窗口函数,将一条消息发给那个窗口SendMessageCallback 将一条消息发给窗口 SendMessageTimeout 向窗口发送一条消息 SendNotifyMessage 向窗口发送一条消息 3. API之文件处理函数 CloseHandle 关闭一个内核对象。其中包括文件、文件映射、进程、线程、安全和同步对象等 CompareFileTime 对比两个文件的时间 CopyFile 复制文件 CreateDirectory 创建一个新目录 CreateFile 打开和创建文件、管道、邮槽、通信服务、设备以及控制台CreateFileMapping 创建一个新的文件映射对象 DeleteFile 删除指定文件

数据库常用函数汇总统计

实验二(续):利用SQL语句查询 三、常用库函数及统计汇总查询 1、求学号为 S1学生的总分和平均分; select sum(score) as TotalScore,avg(score)as AveScore from sc where sno='S1' 2、求选修 C1号课程的最高分、最低分及之间相差的分数; select max(score)as MaxScore, min(score)as MinScore, max(score)- min(score)as diff from sc where cno='C1' 3、求选修 C1号课程的学生人数和最高分; select count(distinct sno),max(score) from sc where cno='C 1' 4、求计算机系学生的总数; select count(sno) from s where dept=' 计算机 ' 5、求学校中共有多少个系; select count(distinct dept) as DeptNum from s 6、统计有成绩同学的人数; select count(score) from sc 7、利用特殊函数 COUNT(*)求计算机系学生的总数; select count(*) from s where dept=' 计算机 '

8、利用特殊函数 COUNT(*)求女学生总数和平均年龄;select count(*),avg(age) from s where sex=' 女 ' 9、利用特殊函数 COUNT(*)求计算机系女教师的总数。select count(*) from t where dept=' 计算机 'and sex=' 女 ' 四、分组查询及排序 1、查询各个教师的教师号及其任课门数; select tno,count(*)as c_num from tc group by tno 2、按系统计女教师的人数; select dept,count(tno) from t where sex=' 女 ' group by dept 3、查询选修两门以上课程的学生的学号和选课门数;select sno,count(*)as sc_num from sc group by sno having count(*)>2 4、查询平均成绩大于 70分的课程号和平均成绩; select cno,avg(score) from sc group by cno having avg(score)>70 5、查询选修 C1的学生学号和成绩,并按成绩降序排列;select sno,score

高中数学函数知识点总结

高中数学函数知识点总结 1. 对于集合,一定要抓住集合的代表元素,及元素的“确定性、互异性、无序性”。 2 进行集合的交、并、补运算时,不要忘记集合本身和空集的特殊情况 注重借助于数轴和文氏图解集合问题。 空集是一切集合的子集,是一切非空集合的真子集。 {} {}如:集合,A x x x B x ax =--===||2 2301 若,则实数的值构成的集合为B A a ? 3. 注意下列性质: {}()集合,,……,的所有子集的个数是;1212a a a n n 要知道它的来历:若B 为A 的子集,则对于元素a 1来说,有2种选择(在或者不在)。同样,对于元素a 2, a 3,……a n ,都有2种选择,所以,总共有2n 种选择, 即集合A 有2n 个子集。 当然,我们也要注意到,这2n 种情况之中,包含了这n 个元素全部在何全部不在的情况,故真子集个数为21n -,非空真子集个数为22n - ()若,;2A B A B A A B B ??== (3)德摩根定律: ()()()()()()C C C C C C U U U U U U A B A B A B A B ==, 有些版本可能是这种写法,遇到后要能够看懂 4. 你会用补集思想解决问题吗?(排除法、间接法) 如:已知关于的不等式 的解集为,若且,求实数x ax x a M M M a --<∈?5 0352 的取值范围。 7. 对映射的概念了解吗?映射f :A →B ,是否注意到A 中元素的任意性和B 中与之对应元素的唯一性,哪几种对应能构成映射? (一对一,多对一,允许B 中有元素无原象。) 注意映射个数的求法。如集合A 中有m 个元素,集合B 中有n 个元素,则从A 到B 的映射个数有n m 个。 如:若}4,3,2,1{=A ,},,{c b a B =;问:A 到B 的映射有 个,B 到A 的映射有 个;A 到B 的函数有 个,若}3,2,1{=A ,则A 到B 的一一映射有 个。 函数)(x y ?=的图象与直线a x =交点的个数为 个。 8. 函数的三要素是什么?如何比较两个函数是否相同? (定义域、对应法则、值域) 相同函数的判断方法:①表达式相同;②定义域一致 (两点必须同时具备) 9. 求函数的定义域有哪些常见类型?

delphi常用函数大全

delphi常用函数大全(转) Abort函数引起放弃的意外处理 Abs函数绝对值函数 AddExitProc函数将一过程添加到运行时库的结束过程表中 Addr函数返回指定对象的地址 AdjustLineBreaks函数将给定字符串的行分隔符调整为CR/LF序列Align属性使控件位于窗口某部分 Alignment属性控件标签的文字位置 AllocMem函数在堆栈上分配给定大小的块 AllowGrayed属性允许一个灰度选择 AnsiCompareStr函数比较字符串(区分大小写) AnsiCompareText函数比较字符串(不区分大小写) AnsiLowerCase函数将字符转换为小写 AnsiUpperCase函数将字符转换为大写 Append函数以附加的方式打开已有的文件 ArcTan函数余切函数 AssignFile函数给文件变量赋一外部文件名 Assigned函数测试函数或过程变量是否为空 AutoSize属性自动控制标签的大小 BackgroundColor属性背景色 BeginThread函数以适当的方式建立用于内存管理的线程 BevelInner属性控件方框的内框方式 BevelOuter属性控件方框的外框方式 BevelWidth属性控件方框的外框宽度 BlockRead函数读一个或多个记录到变量中 BlockWrite函数从变量中写一个或多个记录 BorderStyle属性边界类型 BorderWidth属性边界宽度 Break命令终止for、while、repeat循环语句 Brush属性画刷 Caption属性标签文字的内容 ChangeFileExt函数改变文件的后缀 ChDir函数改变当前目录 Checked属性确定复选框选中状态 Chr函数返回指定序数的字符 CloseFile命令关闭打开的文件 Color属性标签的颜色 Columns属性显示的列数 CompareStr函数比较字符串(区分大小写) Concat函数合并字符串 Continue命令继续for、while、repeat的下一个循环 Copy函数返回一字符串的子串 Cos函数余弦函数 Ctl3D属性是否具有3D效果 Cursor属性鼠标指针移入后的形状 Date函数返回当前的日期 DateTimeToFileDate函数将DELPHI的日期格式转换为DOS的日期格式DateTimeToStr函数将日期时间格式转换为字符串DateTimeToString函数将日期时间格式转换为字符串 DateToStr函数将日期格式转换为字符串

Delphi 文件操作集锦

Delphi 文件操作集锦 Delphi 文件操作集锦 时间:2011-5-26来源:yang 作者: peng点击: 11次Delphi 文件操作集锦 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation uses activex,comobj,shlobj; {$R *.dfm} function ResolveLink(const ALinkfile: String): String; var

link: IShellLink; storage: IPersistFile; filedata: TWin32FindData; buf: Array[0..MAX_PATH] of Char; widepath: WideString; begin OleCheck(CoCreateInstance(CLSID_ShellLink, nil, CLSCTX_INPROC_SERVER, IShellLink, link)); OleCheck(link.QueryInterface(IPersistFile, storage)); widepath := ALinkFile; Result := ‘unable to resolve link‘; If Succeeded(storage.Load(@widepath[1], STGM_READ)) Then If Succeeded(link.Resolve(GetActiveWindow, SLR_NOUPDATE)) Then If Succeeded(link.GetPath(buf, sizeof(buf), filedata, SLGP_UNCPRIORITY)) Then Result := buf; storage := nil; link:= nil; end; // 用法: procedure TForm1.Button1Click(Sender: TObject);

数据库中一些常用的名词解释

◆DB:数据库(Database),DB是统一管理的相关数据的集合。DB能为各种用户共享,具有最小冗余度,数据间联系密切,而又有较高的数据独立性。 ◆DBMS:数据库管理系统(Database Management System),DBMS是位于用户与操作系统之间的一层数据管理软件,为用户或应用程序提供访问DB的方法,包括DB 的建立、查询、更新及各种数据控制。DBMS总是基于某种数据模型,可以分为层次型、网状型、关系型、面向对象型DBMS。 ◆DBS:数据库系统(Database System),DBS是实现有组织地、动态地存储大量关联数据,方便多用户访问的计算机软件、硬件和数据资源组成的系统,即采用了数据库技术的计算机系统。 ◆1:1联系:如果实体集E1中的每个实体最多只能和实体集E2中的一个实体有联系,反之亦然,好么实体集E1对E2的联系称为“一对一联系”,记为“1:1”。 ◆1:N联系:如果实体集E1中每个实体与实体集E2中任意个(零个或多个)实体有联系,而E2中每个实体至多和E1中的一个实体有联系,那么E1对E2的联系是“一对多联系”,记为“1:N”。 ◆M:N联系:如果实体集E1中每个实体与实体集E2中任意个(零个或多个)实体有联系,反之亦然,那么E1对E2的联系是“多对多联系”,记为“M:N”。 ◆数据模型:表示实体类型及实体类型间联系的模型称为“数据模型”。它可分为两种类型:概念数据模型和结构数据模型。 ◆概念数据模型:它是独门于计算机系统的模型,完全不涉及信息在系统中的表示,只是用来描述某个特定组织所关心的信息结构。 ◆结构数据模型:它是直接面向数据库的逻辑结构,是现实世界的第二层抽象。这类模型涉及到计算机系统和数据库管理系统,所以称为“结构数据模型”。结构数据模型应包含:数据结构、数据操作、数据完整性约束三部分。它主要有:层次、网状、关系三种模型。

math中函数以及其他一些库函数

函数以及其他一些库函数 函数名称: abs 函数原型: int abs(int x); 函数功能: 求整数x的绝对值 函数返回: 计算结果 参数说明: 所属文件: <>,<> 使用范例: #include <> #include <> int main() { int number=-1234; printf("number: %d absolute value: %d",number,abs(number)); return 0; } @函数名称: fabs 函数原型: double fabs(double x); 函数功能: 求x的绝对值. 函数返回: 计算结果 参数说明: 所属文件: <> 使用范例: #include <> #include <> int main() { float number=; printf("number: %f absolute value: %f",number,fabs(number)); return 0; } @函数名称: cabs 函数原型: double cabs(struct complex znum) 函数功能: 求复数的绝对值 函数返回: 复数的绝对值 参数说明: zuum为用结构struct complex表示的复数,定义如下:struct complex{ double m; double n; }

所属文件: <> #include <> #include <> int main() { struct complex z; double val; =; =; val=cabs(z); printf("The absolute value of %.2lfi %.2lfj is %.2lf",,,val); return 0; } @函数名称: ceil 函数原型: double ceil(double num) 函数功能: 得到不小于num的最小整数 函数返回: 用双精度表示的最小整数 参数说明: num-实数 所属文件: <> #include <> #include <> int main() { double number=; double down,up; down=floor(number); up=ceil(number); printf("original number %",number); printf("number rounded down %",down); printf("number rounded up %",up); return 0; } @函数名称: sin 函数原型: double sin(double x); 函数功能: 计算sinx的值.正弦函数 函数返回: 计算结果 参数说明: 单位为弧度 所属文件: <> 使用范例:

驱动名词解释

驱动 NTSTATUS NTSTATUS 是被定义为32位的无符号长整型。在驱动程序开发中,人们习惯用NTSTATUS 返回状态。其中0~0X7FFFFFFF,被认为是正确的状态,而0X80000000~0XFFFFFFFF被认为是错误的状态。 有一个非常有用的宏-----NT_SUCCESS,用来检测状态是否正确。 IN IN,OUT,INOUT是一个空的宏,只是用来说明这个参数是用于输入参数,还是输出的参数。 DriverEntry 操作系统在初始化驱动程序的时候会调用DriverEntry,通常会用这个函数来填充dispatch例程的指针,这就象注册回调函数一样。有的设备要创建设备的对象,或者还要创建一个设备名字,以及其他的初始化操作。它的原型: NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ){ } IN,OUT,INOUT是一个空的宏,只是用来说明这个参数是用于输入参数,还是输出的参数。NTSTATUS实际是个长整型可以在DDK头文件NTSTA TUS.H中找到NTSTATUS的代码列表。函数的第一个参数DriverObject是刚被初始化的驱动对象,就是操作系统为这个驱动分配的空间的指针。函数的第二个参数RegistryPath是驱动在注册表中的键值。如果驱动程序需要访问设备的服务键需要保存这个键值以备后用。 UNICODE_STRING UNICODE_STRING结构是通过使用各种本地安全认证(LSA)的功能来指定一个Unicode 字符串。 2结构体原型: typedef struct _LSA_UNICODE_STRING { USHORT Length; USHORT MaximumLength; PWSTR Buffer;} LSA_UNICODE_STRING, *PLSA_UNICODE_STRING, UNICODE_STRING, *PUNICODE_STRING; 3结构成员: Length 指定字符串的长度,以字节为单位指出的Buffer字符串的长度。如果是以NULL字符结尾(即'\0'),则不包括NULL字符的长度。 MaximumLength Buffer字符串的总长度。 MaximumLength和Length的关系可以参照: char c[10] = "123"; sizeof(c);和strlen(c);得出的结果。

常用API函数参数

常用API函数参数5 ImmIsIME 函数功能: 判断指定的句柄是否为IME; 函数原型: BOOL ImmIsIME( HKL hKL ); 参数hKL: 待检查的键盘布局句柄; 返回值: 函数调用成功返回1,失败返回0. 速查信息: Windows NT: 要求4.0或更高版本 Windows: 要求Windows 95 或更高. Windows CE:不支持. Header: 声明在imm.h. Import Library: imm32.lib. Windows XP没有自带五笔型输入法,这对五笔型用户而言无疑是个大大的遗憾。网上的五笔型输入法虽然种类很多,也不乏优秀的版本,但一方面有些版本是共享软件需要注册,另一方面也许很多五笔型输入法的老用户最习惯用的还是老牌的“王码五笔型输入法86/98版”。 微软的Office XP软件中包含了这个老牌的五笔型输入法,但如果用户并不使用Office XP中的任何组件,仅仅是为了使用“王码五笔型输入法”而运行Office XP安装程序,就显的有些小题大做了,更不用说是某些零时在外面用公用电脑而又想用五笔型输入法的情况。于是网上出现了很多简化的安装方法,大体上可以分为三个步骤: 拷贝输入法文件(从Of还是9x/ME。示例代码fice XP光盘中或已经安装了“王码五笔型输入法”的电脑中提取) 增加注册表项 重启后通过控制面板添加输入法

整个过程中拷贝输入法文件和增加注册表项可以用批处理和导入注册表文件来简化操作,但必须重启计算机才能在控制面板里添加输入法,这同样让使用者觉得比较烦琐。那么作为一个编程爱好者能不能通过写个小程序来实现在不重新启动计算机的情况下全自动的安装“王码五笔型输入法”呢(也就是即装即用)?答案是肯定的!因为微软的Office XP 安装程序做到了,这就表示微软肯定留有一个专门用来安装输入法的接口,一般来说应该是一系列API函数。 经过一番摸索,笔者在MSDN里找到了这个可以用来安装输入法的API:ImmInstallIME()。Ok,现在我们就开始利用这个API来实现自己的“王码五笔型输入法”全自动安装程序。 一、准备素材 我们先试着从Office XP光盘中提取“王码五笔型输入法”的输入法文件。通过Windows 的查找功能在Office XP的第一张安装盘中查找与“WINWB”相关的文件,在OFFICE1.CAB 中找到了一下14个文件:WINWB86.CHM.*、https://www.sodocs.net/doc/c111633598.html,T.*、WINWB86.HLP.*、WINWB86A.IME.*、WINWB86A.MB.*、WINWB86W.IME.*、WINWB86W.MB.*、WINWB98.CHM.*、https://www.sodocs.net/doc/c111633598.html,T.*、WINWB98.HLP.*、WINWB98A.IME.*、WINWB98A.MB.*、WINWB98W.IME.*、WINWB98W.MB.*,其中*是很长的一串由字母、数字和下滑线组成的序列(个人认为应该是微软为了校验文件内容的正确性而加上的内容为该文件效验码的后缀吧)。去掉这个长长的后缀,可以看到5 种类型的文件。很明显,*.CHM、*.CNT和*.HLP是五笔型输入法的帮助文件,*.MB是码表文件,而*.IME是主要的输入法文件。其中*.IME和*.MB有文件名部分以A结尾和以W结尾两个版本,经过笔者试验证实了它们分别是ANSI和UNICODE两种版本的输入法文件。文件名部分以A结尾的文件适用于Windows 9x,以W结尾的文件适用于NT系列Windows系统。 提取了输入法文件后必须让安装程序针对不同版本的操作系统将它们拷贝到正确的目录,以便调用API来进行输入法安装。笔者分别在安装了Office XP中自带的“王码五笔型输入法”的Windows 98SE和Windows XP操作系统中查找以上文件,发现帮助文件都存放在WINDOWSHELP目录中(这里假设Windows系统都安装在WINDOWS目录)。而主要的输入法文件(*.IME)和码表文件(*.MB)在Windows 9x下存放于WINDOWSSYSTEM目录中,在NT系列Windows系统中存放于WINDOWSSYSTEM32目录中。 二、相关API函数 素材的准备工作已经完成,现在我们来看一下代码编写过程中需要用到的4个主要的API函数。 2.1 GetVersion 函数原型:

相关主题