`
lovecontry
  • 浏览: 1029675 次
文章分类
社区版块
存档分类
最新评论

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上有一点点小却别所以就不说了,以免混淆了

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

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics