收藏 分享(赏)

嵌入式操作系统考试准备.docx

上传人:dreamzhangning 文档编号:2233480 上传时间:2018-09-06 格式:DOCX 页数:8 大小:169.70KB
下载 相关 举报
嵌入式操作系统考试准备.docx_第1页
第1页 / 共8页
嵌入式操作系统考试准备.docx_第2页
第2页 / 共8页
嵌入式操作系统考试准备.docx_第3页
第3页 / 共8页
嵌入式操作系统考试准备.docx_第4页
第4页 / 共8页
嵌入式操作系统考试准备.docx_第5页
第5页 / 共8页
点击查看更多>>
资源描述

1、考试内容 任务基本形式 osTaskSwHook osTCBHighRdy osIntCtxSw; linux 中断分为上下部,上下半部处理机制 Linux 模块加载,卸载 任务间通信。缓冲区、邮箱 signal,kill1.用户任务代码一般结构: 无限循环结构void mytask(void *pdata)for (;) 可以被中断的用户代码;OS_ENTER_CRITICAL();/进入临界段(关中断)不可以被中断的用户代码;OS_EXIT_CRITICAL(); /退出临界段(开中断)可以被中断的用户代码; 2. OS_ENTER_CRITICAL()和 OS_EXIT_CRITICAL

2、()是 uC/OS-II 定义的两个宏。分别封装了关中断代码和开中断代码 3. 用户应用程序一般结构:void Mytask1(void *pdata) /定义用户任务 1for(;) void Mytask2(void *pdata) /定义用户任务 2for(;) void main()OSInit(); /初始化 uc/os.OSTaskCreate(Mytask1,堆栈栈顶指针 .); /创建用户任务 1OSTaskCreate(Mytask2,堆栈栈顶指针 ); /创建用户任务 2OSStart(); /启动 uc/os4. 定义任务堆栈的栈区:只要定义一个 OS_STK 类型的数组

3、即可。如:#define TASK_STK_SIZE 512 /定义堆栈长度(512)OS_STK TaskStkTASK_STK_SIZE /定义数组作为任务堆栈5. OSTaskCreate 函数参数结构:INT8U OSTaskCreate(void (*task)(void * pd), /指向任务的指针void * pdata, /传递给任务的参数OS_STK *ptos, /任务堆栈栈顶指针INT8U prio /任务优先级别);6. 优先级置位算法:7. 对任务就绪表的 3 种操作:登记、注销、查找最高优先级登记:当某个任务处于就绪态时,系统就将该任务登记在任务就绪表中,即在就绪

4、表中将该任务的对应位置 1.a) OSRdyGrp | =OSMapTblprio3;b) OSRdyTblprio3 |=OSMapTblprio注销:当某个任务需要脱离就绪状态时,系统在就绪表中将该任务的对应位置 0if(OSRdyTblprio 3查找: y=OSUnMapTblOSRdyGrp; /获得优先级别的高三位x=OSUnMapTblOSRdyGrpx; /获得低三位prio=(y3)+x; /获得就绪任务的优先级别OSUnMapTbl使 uc/os 为提高查找速度定义的一个数组,共有 256 个元素 8. 习惯在调用函数 OSStart()之前创建一个任务,并赋予它最高优先级

5、别,从而使它成为起始任务;在起始任务中,再创建其他各任务void main(void)OSInit();OSTaskCreate ( TaskStart, .); /创建起始任务 TaskStartOSStart();/开始多任务调度/*起始任务*/void TaskStart( void * pdata). /在这个位置安装并启动 uc/os 的时钟OStatInit();. /在这个位置创建其他任务for(;)起始任务的代码9.创建信号量OS_EVENT *OSSemCreate(INT16U cnt /信号量计数器初始值);返回值为已创建的信号量的指针请求信号量void OSSemPen

6、d(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(

7、CommTxPart, /内存分区的首地址50, /分区内存块的数目64, /每个内存块的长度OSStart()12.请求内存块/定义全局变量OS_MEM *CommTxBuffer; /定义内存分区指针INT8U CommTxPart5064; /定义分区和内存块INT8U err;INT8U *BlkPtr; /定义内存块指针/在主函数的适当位置建立内存分区void main(void)同前/在任务 MyTask 的合适位置请求内存块void MyTask(void*)pdata).for(;)BlkPtr = OSMemGet (CommTxBuffer, /内存分区的指针核心数据和资源

8、的初始化;注册以及注消,释放;底层设备操作函数;19.驱动嵌入内核int init_module(void)int result;result = register_chrdev(0, “test“, 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,

9、“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 文件中可以看你请求的中断

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报