资源描述
考试内容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 int long flags,const char *device); irq: 是要申请的中断。 handle:中断处理函数指针。 flags:SA_INTERRUPT 请求一个快速中断,0 正常中断。 device:设备名。如果登记成功,返回0,这时在/proc/interrupts文件中可以看你请求的中断
展开阅读全文