编写Small RTOS51 的驱动程序

编写small rtos51 的驱动程序
函数的可重入
我们在编写一个驱动程序之前要判断该函数是否为可重入函数。如果一个函数可能被多
个任务和/或中断同时调用,那么该函数就必须是可重入的,而驱动程序一般要求可被多个
任务/或中断同时调用,这就需要可重入了。一个函数具有可重入性的条件是:
1) 不使用任何共享资源(全局变量、共享外设、内部设备等);
2) 如果必须使用一些共享资源,可在使用共享资源前关中断,使用完共享资源后开中
断;
3) 如果必须使用一些共享资源,而且使用时又不能关中断,则任何使用这个共享资源
的任务在使用共享资源前申请相应信号量,得到允许后再使用共享资源,使用完共
享资源后释放信号量。
在ansi c 的标准实现中,以上条件比较好实现,但在keil c51 中就比较麻烦,最主
要是判断函数是否有局部变量分配在内存中。如何判断一个函数是否有局部变量分配在内存
中?方法也不难。我们假设文件file1.c 中有一个函数fuction, 首先,让编译器将文件
file1.c 编译成汇编文件file.src(在uv2 中,在相应的文件上点鼠标右键,选择options for
file ‘file1.c’在properties 页选上assemble src file。注意是实勾非虚勾。然后编译工
程即可)。打开file.src,查找?dt? fuction? file1、?pd? fuction? file1 和?xd?
fuction? file1(如果fuction 有参数则查找?dt?_fuction? file1、?pd? _fuction?
file1 和?xd? _fuction? file1),看这些数据段下是否定义有变量,如果没有,恭喜您,
fuction 的所有局部变量都分配到寄存器中,可以按照一般的方法让函数具备重入性。如果
其中任意一个数据段定义有变量,很不幸,您只有另想办法了。特别的,如果参数在这些数
据段中定义,即使不将该函数与任何函数进行覆盖分析,在函数中使用2)、3)的方法都不
能使函数具有重入性。这是因为在函数执行第一条语句前已经把参数复制到这些变量中,
2)、3)的方法的前提已经不存在了。
驱动程序的编写方法
1. 使用任务编写驱动程序
有一些设备需要cpu 周期地为其服务,典型的是扫描显示和扫描键盘。可以给它们分配
相应的任务,与用户任务一起调度。这样,就可以使用任何任务间通信的方法实现驱动程序。
2. 使用消息队列编写驱动程序
有一些设备具有自己的中断,典型的是串口输出。可以利用消息队列将用户任务需要的
服务通过消息队列排队、缓冲起来,利用中断功能依次服务。这样,一般不需要考虑重入这
个头疼的问题。
3. 使用信号量编写驱动程序
有一些设备既不需要cpu 的周期服务,又不具有自己的中断,典型的是全局变量、模
拟i2c 总线等。假如该设备速度又比较慢,就需要用信号量来独占该设备了。这时,就不能
将驱动程序编写成一个函数。这是因为函数调用ossempend 后,编译器认为所有寄存器
已经发生变化,它不会用这些寄存器保存有用的数据。而参数肯定是有用数据,必将分配到
内存中。这就不可能使其具有重入性。替代的方法是按照一般的方法编写一个函数,这个函
数只是对这个设备进行操作。然后定义一个宏,在宏中申请信号量,调用这个函数并释放信
号量。这样,只要保证那个函数的局部变量全部分配到寄存器中就可以了。
4. 复合方法
有一些驱动程序比较复杂(例如tcp/ip 通讯协议),可以结合两种或两种以上的方法
实现。下面我们就举一些例子来说明,驱动程序的编写。

DW-S402涉密载体管控系统介绍
调查:智能电视究竟有哪些不得不一吐为快的缺点
振动加速度传感器的工作原理解析
一文了解Moku:Lab多功能电子测量仪
爱立信分布式云的联网无人机解决方案助力运营商充分挖掘5G的商业潜能
编写Small RTOS51 的驱动程序
GIS回路电阻测试仪的作用
缝合针弹性韧性测试仪对圆针和三角针如何检验?
Python中互换X和Y的值代码
关于步进电机的选用与设计介绍
我国3D打印医疗器械将迎来蓬勃发展
小米6什么时候上市?小米6最新消息:小米6价格最新曝光,小米6这一次玩大了!骁龙835+6GB,价格飙升
阐述开关电源的十大热门关注
自愈合材料有望作为高科技设备的“超级电子皮肤”
性能出色的PoE产品如何协助IoT应用达成节能设计
新能源汽车驱动用永磁同步电机的性能要求
新型高性能HQV Vida视频处理器芯片(IDT)
OPPOR15梦镜版评测 在机身设计和工艺打磨上越来越多元化
电动自行车公共安全行业发展的新思路和新模式
云与大数据时代,华为云助企业用户安全稳健发展