zoukankan      html  css  js  c++  java
  • eCos中的线程与同步

    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

  • 相关阅读:
    用Python计算最长公共子序列和最长公共子串
    两个有序数列,求中间值 Median of Two Sorted Arrays
    python判断平衡二叉树
    经验之谈:如何为你的机器学习问题选择合适的算法?
    跑道没了,它们还在跑:澳门赛狗业的遗孤
    钉钉:工作的归工作,生活的…也归工作?
    假·照骗,真·社交焦虑
    苹果市值破万亿,iPhone 会涨价吗?
    写日志(log)
    多维数组排序
  • 原文地址:https://www.cnblogs.com/jingzhishen/p/3890010.html
Copyright © 2011-2022 走看看