UC/OS-II学习 2

好像现在Android很火,真想去学android不过android也是linux内核,即在linux内核上搞一个java虚拟机,执行java程序(我的理解不一定正确),所以学习LINUX还是很好啊。。。呵呵。

转正题UC/OS-II学习。

可重入函数

上次讲到可重入函数,什么是可重入函数呢? 可重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码,而返回控制时不会出现什么错误。(简单点说就是程序在调用执行一个函数时,被中断或者挂起了,在中断执行完,或者内核再次调度此任务继续执行此函数时候,其中的数据不会都不会被改变)。

void  swap(int *x, int *y)    //可重入函数

{

    int tmp = *x;

    *x = *y;

    *y = tmp;

}

int tmp;

void swap(int *x, int *y)    //不可重入函数(tmp可能会被改变)

{

    tmp = *x;

    *x = *y;

    *y = tmp;

}

也需会看到最简单的编写可重入函数的方法就是使用局部变量,而在现实的工程中式很困难的,所以引入了一种锁机制,即如果想使用一个函数(该函数可以被多个任务调用)用到了一些全局变量,可以讲此全局数据锁上,在使用完成之后释放,在使用期间别的任务不能用到此全局变量。

任务的调度需要有中断,或者模拟的中断环境,所以要保护数据也可以关闭用关闭中断来实现。

实现方法:

void Fuction(void)

{

    OS_ENTER_CRITICAL(); //保存当前寄存器状态,关闭中断

    /*数据处理*/

    OS_EXIT_CRITICAL();  //回复原来寄存器值(这里为什么不去刻意开中断呢??因为原来的函数可能已将在关中断的环境下执行,所以不应该开中断,只应该回复到原来状态)

}

在实现任务间通信时候最会涉及对共享数据的处理,要保证处理数据的唯一性,与顺序性——以避免竞争与数据破坏。

还有采用关调度来实现共享资源的保护,但一般不用比较危险

采用信号量机制保护,因为与linux上有一点点小却别所以就不说了,以免混淆了

死锁:死锁也称抱死,知两个或者多个任务互相想用别的任务占有资源,而不释放自己拥有的资源。主要的处理方法就是让任务先得到所有的资源然后执行后立即释放,或者按照同样的循序去申请资源,而后按照逆序释放资源。同样可以设置申请资源的超时时间。

以上两个小结都是理论性的(不正确之处请指正) 下一次写就会分析代码了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值