嵌入式操作系统考试准备.docx_第1页
嵌入式操作系统考试准备.docx_第2页
嵌入式操作系统考试准备.docx_第3页
嵌入式操作系统考试准备.docx_第4页
嵌入式操作系统考试准备.docx_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

考试内容l 任务基本形式l osTaskSwHookl osTCBHighRdyl osIntCtxSw;l linux中断分为上下部,上下半部处理机制l Linux模块加载,卸载l 任务间通信。缓冲区、邮箱l signal,kill1.用户任务代码一般结构: 无限循环结构void mytask(void *pdata) for (;) 可以被中断的用户代码; OS_ENTER_CRITICAL();/进入临界段(关中断) 不可以被中断的用户代码; OS_EXIT_CRITICAL(); /退出临界段(开中断) 可以被中断的用户代码; 2. OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()是uC/OS-II定义的两个宏。分别封装了关中断代码和开中断代码 3. 用户应用程序一般结构:void Mytask1(void *pdata) /定义用户任务1for(;).void Mytask2(void *pdata) /定义用户任务2for(;) .void main().OSInit(); /初始化uc/os.OSTaskCreate(Mytask1,堆栈栈顶指针.); /创建用户任务1OSTaskCreate(Mytask2,堆栈栈顶指针.); /创建用户任务2.OSStart(); /启动uc/os4. 定义任务堆栈的栈区:只要定义一个OS_STK类型的数组即可。如:#define TASK_STK_SIZE 512 /定义堆栈长度(512)OS_STK TaskStkTASK_STK_SIZE /定义数组作为任务堆栈5. OSTaskCreate函数参数结构:INT8UOSTaskCreate(void (*task)(void * pd), /指向任务的指针void * pdata, /传递给任务的参数OS_STK *ptos, /任务堆栈栈顶指针INT8U prio /任务优先级别);6. 优先级置位算法:7. 对任务就绪表的3种操作:登记、注销、查找最高优先级登记:当某个任务处于就绪态时,系统就将该任务登记在任务就绪表中,即在就绪表中将该任务的对应位置1.a) OSRdyGrp | =OSMapTblprio3;b) OSRdyTblprio3 |=OSMapTblprio&0x07;注销:当某个任务需要脱离就绪状态时,系统在就绪表中将该任务的对应位置0if(OSRdyTblprio 3& -OSMapTblprio&0x07)=0)OSRdyGrp&=-OSMapTblprio 3;查找:l y=OSUnMapTblOSRdyGrp; /获得优先级别的高三位x=OSUnMapTblOSRdyGrpx; /获得低三位prio=(y3)+x; /获得就绪任务的优先级别OSUnMapTbl使uc/os为提高查找速度定义的一个数组,共有256个元素 8. 习惯在调用函数OSStart()之前创建一个任务,并赋予它最高优先级别,从而使它成为起始任务;在起始任务中,再创建其他各任务void main(void).OSInit();.OSTaskCreate ( TaskStart, .); /创建起始任务TaskStartOSStart();/开始多任务调度/*起始任务*/void TaskStart( void * pdata)./在这个位置安装并启动uc/os的时钟OStatInit();./在这个位置创建其他任务for(;)起始任务的代码9.创建信号量OS_EVENT *OSSemCreate(INT16U cnt /信号量计数器初始值);返回值为已创建的信号量的指针请求信号量void OSSemPend(OS_EVENT *pevent,/信号量的指针INT16U timeout, /等待时限,如果参数设置为0,表明任务的等待时间为无限长INT8U *err /错误信息); 释放信号量INT8U OSSemPost(OS_EVENT *pevent,/信号量的指针);10.创建信号量集11.创建内存分区/定义全局变量OS_MEM *CommTxBuffer;/定义内存分区指针INT8U CommTxPart5064;/定义分区和内存块INT8U err;/在主函数的适当位置建立内存分区void main(void)OSInit();.CommTxBuffer = OSMemCreate(CommTxPart,/内存分区的首地址50,/分区内存块的数目64,/每个内存块的长度&err);.OSStart()12.请求内存块/定义全局变量OS_MEM *CommTxBuffer;/定义内存分区指针INT8U CommTxPart5064;/定义分区和内存块INT8U err;INT8U *BlkPtr;/定义内存块指针/在主函数的适当位置建立内存分区void main(void)同前/在任务MyTask的合适位置请求内存块void MyTask(void*)pdata).for(;)BlkPtr = OSMemGet (CommTxBuffer,/内存分区的指针&err/错误信息);.13.14.移植 移植第一步基本的配置和定义 移植第二步移植与处理器相关的OS_CPU_A.ASM汇编代码文件 移植第三步移植与处理器相关的OS_CPU_C.C标准C代码文件15.编译Linux内核步骤 解压源码 配置内核 编译内核和模块 配置启动文件16.模块实现机制内核符号表模块引用计数器模块依赖17.模块生成18.驱动程序一般可分三部分 核心数据结构; 核心数据和资源的初始化; 注册以及注消,释放; 底层设备操作函数;19.驱动嵌入内核int init_module(void) int result; result = register_chrdev(0, test, &test_fops); if (result 0) printk(KERN_INFO test: cant get major number ); return result; if (test_major = 0) test_major = result; / dynamic return 0; 20.释放设备void cleanup_module(void) unregister_chrdev(test_major, test); 在用rmmod卸载模块时,cleanup_module函数被调用,它释放字符设备test在系统字符设备表中占有的表项。21.设备编译,加载过后编写测试文件:main() int testdev; int i; char buf10; testdev = open(/dev/test,O_RDWR); if ( testdev = -1 ) printf(Cannt open file ); exit(0); close(testdev); 22.中断注册要使用一个中断,必须先向系统登记。 int request_irq(unsigned int irq , void(*handle)(int,void *,struct pt_regs *), unsigned

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论