http://blog.csdn.net/ooaven/article/details/6280018

先看一下eCos线程的创建、控制以及优先级的操作这三个方面的知识,主要是对它的实现方式及API做点介绍:

1.线程的创建

void cyg_thread_create(...),创建一个线程,处于挂起状态

2.线程的控制

void cyg_thread_yield (),使线程放弃对处理器的控制

void cyg_thread_delay (cyg_tick_count_t    delay),使线程挂起一定的时间

void cyg_thread_suspend (cyg_handle_t  thread),挂起指定的线程

void cyg_thread_resume (cyg_handle_t  thread),启动指定线程

void cyg_thread_release (cyg_handle_t  thread),将处于阻塞态的线程释放

void cyg_thread_exit (void),线程自己退出

void cyg_thread_kill (cyg_handle_t  thread),杀死另外一个线程

void cyg_thread_delete(cyg_handle_t  thread),删除一个线程

3.线程优先级的操作

一般来说,线程的优先级使用0 ~ 31的整数来表示。空闲线程是最低优先级。

cyg_priority_t  cyg_thread_get_priority (cyg_handle_t  thread),得到指定线程的优先级

cyg_priority_t  cyg_thread_get_current_priority (cyg_handle_t  thread),得到指定线程的当前优先级

void cyg_thread_set_priority (cyg_thread_t  thread,  cyg_thread_t  priority),修改指定线程的优先级

同步机制

eCos的同步机制提供了几个同步原语来实现多线程之间的协同工作和对资源的合理分配利用:

1.Mutex 互斥体,实现线程对资源的安全共享。

简单概念:

static volatile int counter = 0; 
static cyg_mutex_t lock;/* 定义一个互斥体对象,即一把锁 */
void process_event(void)
{
... cyg_mutex_lock(&lock); /* 上锁 */
counter ++; /* 访问临界资源 */
cyg_mutex_unlock(&lock); /* 解锁,让其它线程可以继续使用 counter 这个资源 */ ...
}

eCos内核关于Mutex的API:

void cyg_mutex_init (cyg_mutex_t*  mutex),初始化一个互斥体

void cyg_mutex_destory (cyg_mutex_t* mutex),报废一个互斥体

void cyg_mutex_lock (cyg_mutex_t* mutex),锁住Mutex对象

void cyg_mutex_unlock (cyg_mutex_t* mutex),解锁

cyg_bool_t  cyg_mutex_trylock (cyg_mutex_t* mutex),尝试着上锁

void cyg_mutex_release (cyg_mutex_t* mutex),所有等待这个mutex对象的线程,我都要把它们释放,想获取,没门

void cyg_mutex_set_ceiling (cyg_mutex_t* mutex,  cyg_priority_t  priority),避免死锁的常用手法,将这个mutex的优先级置顶,关于这个还有个任务优先级倒置的问题,以后再详解

void cyg_mutex_set_protocol (cyg_mutex_t* mutex,  enum  cyg_mutex_protocol  protocol),设置互斥体协议

2.Condition Variable 条件变量

void cyg_cond_init ( cyg_cond_t* cond,  cyg_cond_t* mutex),初始化一个条件变量

void cyg_cond_destory (cyg_cond_t* cond),报废一个条件变量

cyg_bool_t  cyg_cond_wait ( cyg_cond_t* cond),等待一个条件变量

void cyg_cond_signal (cyg_cond_t* cond),唤醒一个等待cond的线程,通常是级别高的会优先被唤醒

void cyg_cond_broadcast (cyg_cond_t* cond),唤醒所有等待cond的线程

cyg_bool_t cyg_cond_timed_wait ( cyg_cond_t* cond, cyg_tick_count_t abstime),等待cond,并具有超时功能

3.Semaphore 信号量

void cyg_semaphore_init (cyg_sem_t* sem, cyg_count32 val),初始化一个信号量,其计数器的初值为val

void cyg_semaphore_destory (cyg_sem_t* sem)

cyg_bool_t cyg_semaphore_wait (cyg_sem_t* sem),等待一个信号量

cyg_bool_t cyg_semaphore_timed_wait (cyg_sem_t* sem, cyg_tick_count_t abstime),如上,还有超时功能

cyg_bool_t cyg_semaphore_trywait (cyg_sem_t* sem),尝试等待

void cyg_semaphore_post (cyg_sem_t* sem) ,信号量sem的计数器加1

void cyg_semaphore_peek (cyg_sem_t* sem, cyg_count32* val),获取sem当前的计数器值

4.MailBox 邮箱

类似于Semaphore,不同之处在于,mailbox还可以被线程在事件发生时用来传递一些数据。

void cyg_mbox_create (cyg_handle_t* handle, cyg_mbox* mbox)

void cyg_mbox_delete (cyg_handle_t  mbox)

void cyg_mbox_get (cyg_handle_t  mbox),从MailBox内读数据

void* cyg_mbox_tryget (cyg_handle_t mbox)

void* cyg_mbox_peek_item (cyg_handle_t mbox),从MailBox内读数据,但数据仍在MailBox里

cyg_bool_t cyg_mbox_put (cyg_handle_t mbox, void* item),将消息送入一个MailBox内

cyg_bool_t cyg_mbox_timed_put (cyg_handle_t mbox, void* item, cyg_tick_count_t abstime)

cyg_bool_t cyg_mbox_tryput (cyg_handle_t mbox, void* item)

cyg_count32 cyg_mbox_peek (cyg_handle_t mbox),返回MailBox内等待处理的消息数

cyg_bool_t cyg_mbox_waiting_to_get (cyg_handle_t mbox),检测是否有线程在等待MailBox中的消息

cyg_bool_t cyg_mbox_waiting_to_put (cyg_handle_t mbox),检测是否有线程在等待从MailBox中删除消息以便送入新消息

5.Flag 事件标志

void cyg_flag_init (cyg_flag_t* flag)

void cyg_flag_destory (cyg_flag_t* flag)

void cyg_flag_setbits (cyg_flag_t* flag, cyg_flag_value_t value),对事件标志位进行设置

void cyg_flag_maskbits (cyg_flag_t* flag, cyg_flag_value_t value),清除事件标志中的某些位

cyg_flag_value_t cyg_flag_wait ( cyg_flag_t* falg, cyg_flag_value_t pattern, cyg_flag_mode_t mode),使线程阻塞等待一组事件的发生

cyg_flag_value_t cyg_flag_timed_wait (...)

cyg_flag_value_t cyg_flag_poll (...),检测事件标志中的一组事件是否发生

cyg_flag_value_t  cyg_flag_peek (cyg_flag_t* flag ),返回事件标志中的当前值

cyg_bool_t cyg_flag_waiting (cyg_flag_t* flag),检测当前是否有线程处于等待事件标志的阻塞状态

6.Spinlock

spinlock是为多处理器系统(SMP)中的应用程序提供的一个同步原语,关于SMP,以后详解。

void cyg_spinlock_init (cyg_spinlock  lock,  cyg_bool_t  locked)

void cyg_spinlock_destory (cyg_spinlock_t  lock)

void cyg_spinlock_spin (cyg_spinlock_t  lock),对spinlock进行声称

void cyg_spinlock_clear (cyg_spinlock_t* lock),释放一个spinlock

cyg_bool_t cyg_spinlock_try (cyg_spinlock_t lock),声称一个spinlock

cyg_bool_t cyg_spinlock_test (cyg_spinlock_t lock),检查当前是否有线程正在阻塞等待spinlock

void cyg_spinlock_spin_intsave (cyg_spinlock_t lock, cyg_addrword_t istate),声称spinlock,并禁止中断

void cyg_spinlock_clear_intsave (cyg_spinlock_t* lock, cyg_addrword_t istate),释放一个spinlock

to be continued

eCos中的线程与同步的更多相关文章

  1. c# 中的线程和同步

    一.新建线程的3种方法 a)异步委托:b)Thread类:c)线程池: 二.异步委托 1.简单使用,检查委托是否完成其任务 a) 通过 BeginInvoke()  的返回值IAsyncResult ...

  2. Windows API学习---用户方式中的线程同步

    前言 当所有的线程在互相之间不需要进行通信的情况下就能够顺利地运行时, Micrsoft Windows的运行性能最好.但是,线程很少能够在所有的时间都独立地进行操作.通常情况下,要生成一些线程来处理 ...

  3. -1-5 java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁 sleep()和wait()方法的区别 为什么wait(),notify(),notifyAll()等方法都定义在Object类中

     本文关键词: java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁  sleep()和wait()方法的区别 为什么wait( ...

  4. 浅谈利用同步机制解决Java中的线程安全问题

    我们知道大多数程序都不会是单线程程序,单线程程序的功能非常有限,我们假设一下所有的程序都是单线程程序,那么会带来怎样的结果呢?假如淘宝是单线程程序,一直都只能一个一个用户去访问,你要在网上买东西还得等 ...

  5. Java中线程的同步问题

    在生活中我们时常会遇到同步的问题,而且大多数的实际问题都是线程的同步问题 我这里以生活中的火车售票来进行举例: 假设现在我们总共有1000张票要进行出售,共有10个出售点,那么当售票到最后只有一张票时 ...

  6. java中的线程问题是(四)——线程同步问题

    多线程的并发,给我们编程带来很多好处,完成更多更有效率的程序.但是也给我们带来线程安全问题. 解决问题的关键就是要保证容易出问题的代码的原子性,所谓原子性就是指:当a线程在执行某段代码的时候,别的线程 ...

  7. Java中的线程同步

    Java 中的线程同步问题: 1. 线程同步: 对于访问同一份资源的多个线程之间, 来进行协调的这个东西. 2. 同步方法: 当某个对象调用了同步方法时, 该对象上的其它同步方法必须等待该同步方法执行 ...

  8. 关于Java中的线程安全(线程同步)

    java中的线程安全是什么: 就是线程同步的意思,就是当一个程序对一个线程安全的方法或者语句进行访问的时候,其他的不能再对他进行操作了,必须等到这次访问结束以后才能对这个线程安全的方法进行访问 什么叫 ...

  9. C#中的线程(二)线程同步

    C#中的线程(二)线程同步   Keywords:C# 线程Source:http://www.albahari.com/threading/Author: Joe AlbahariTranslato ...

随机推荐

  1. Java Calendar类简单用法

    我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3832307.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体验 ...

  2. Hyper-V 虚拟机连接外部网络

    Hyper-V创建好虚拟机之后,在默认配置下是没有网络连接的,这个时候就需要进行简单的配置,即可让虚拟机连接外部网络: 在Hyper-V管理器中,右键点击后出现菜单,选择"虚拟交换机管理器& ...

  3. OpenJudge 2721 忽略大小写比较字符串大小

    1.Link: http://bailian.openjudge.cn/practice/2721/ 2.Content: 总时间限制: 1000ms 内存限制: 65536kB 描述 一般我们用st ...

  4. 第六章 Qt布局管理器Layout

    第六章 Qt布局管理器Layout 大家有没有发现一个现象,我们放置一个组件,给组件最原始的定位是给出这个控件的坐标和宽高值,这样Qt就知道这个组件的位置.当用户改变窗口的大小,组件还静静地呆在原来的 ...

  5. Linux的网卡由eth0变成了eth1,如何修复 (转载)

    Linux的网卡由eth0变成了eth1,如何修复   使用wmware安装了linux,安装成功后,使用的网卡是eth0,没有eth1.但是用过一段时间后,不知道为什么eth0无法使用,系统却自动生 ...

  6. 转:浅谈大型web系统架构

    浅谈大型web系统架构 动态应用,是相对于网站静态内容而言,是指以c/c++.php.Java.perl..net等服务器端语言开发的网络应用软件,比如论坛.网络相册.交友.BLOG等常见应用.动态应 ...

  7. 51nod1264线段相交

    1264 线段相交 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 给出平面上两条线段的两个端点,判断这两条线段是否相交(有一个公共点或有部分重合认为相交). 如果相交, ...

  8. ARM-Linux S5PV210 UART驱动(6)----platform device的添加

    开发板是飞凌OK210 arch/arm/mach-s5pv210/mach-smdkc110.c 首先是UART的寄存器默认配置信息: /* Following are default values ...

  9. [转]Unity3D游戏开发之数据持久化PlayerPrefs的使用

    转自 http://blog.csdn.net/qinyuanpei/article/details/24195977 首先我们来看两段Unity3D中实现数据读写的简单代码吧: //保存数据 Pla ...

  10. Linked List Sorting (链表)

    Linked List Sorting (链表)   A linked list consists of a series of structures, which are not necessari ...