rt-thread learning notes

rt-thread learning notes

2018-01-15

  > 001  具有相同优先级的线程,每个线程的时间片大小都可以在初始化或创建该线程时指定

1 rt_thread_t rt_thread_create(const char *name,
2                              void (*entry)(void *parameter),
3                              void       *parameter,
4                              rt_uint32_t stack_size,
5                              rt_uint8_t  priority,
6                              rt_uint32_t tick)

2018-01-16 

  > 002  rt_thread_create( ) & rt_thread_init( ) 两者区别

      rt_thread_create( ) 动态创建线程,调用时才创建

      rt_thread_init( ) 静态线程,编译时即创建OK

  > 003  rt_thread_sleep( ) & rt_thread_delay( ) 两者区别

       ?...

  > 004  软件定时器实现的机理

       ?...

  > 005  rt_timer_create( ) & rt_timer_init( ) 两者区别

       ?...

  > 006  rt_timer_delete( ) & rt_timer_detach( ) 两者区别

      rt_timer_delete( )  删除定时器,系统会把定时器从rt_timer_list链表中删除,然后释放定时器控制块所占用的内存,对应函数rt_timer_create( )

      rt_timer_detach( )  脱离定时器,系统会把定时器对象从系统容器的定时器链表中删除,但是定时器所占用的内存不会被释放,对应函数rt_timer_init( )

  > 007  临界区:多个线程同时操作/访问同一块区域

  > 008  任务同步的核心思想:在访问临界区的时候只允许一个(或一类)任务运行

  > 009  操作系统中牵扯到关闭中断的操作,应做到关闭中断时间尽可能短,因为一旦关闭中断,系统将无法响应外部中断或事件,这很影响系统的实时性

      使用得当,将会是一种快速、高效的同步方式

      使用不当,将可能导致系统毫无实时性可言

  > 010  为保证一行代码的互斥运行,最快速的方法是使用中断锁而非信号量或互斥量

  > 011  调度器锁:给调度器上锁,系统依然能够响应外部中断,故在使用调度器锁进行任务同步时,需考虑任务访问的临界资源是否会被中断所修改

2018-01-19

  > 012  互斥量同一线程多次获取,多次释放,几个意思

 1 while(1)
 2 {
 3     result = rt_mutex_take(mutex, RT_WAITING_FOREVER);   
 4     result = rt_mutex_take(mutex, RT_WAITING_FOREVER);   
 5 
 6     if(result != RT_EOK)
 7     {
 8         tc_stat(TC_STAT_END | TC_STAT_FAILED);
 9     }
10 
11     tick = rt_tick_get();
12     while(rt_tickget() - tick < 50);
13 
14     rt_mutex_release(mutex);
15     rt_mutex_release(mutex);
16 }

如果互斥量已经被当前线程线程控制,则该互斥量的持有计数加1,当前线程也不会挂起等待 ,即多次请求获取互斥量,会将该互斥量的持有计数加1

只有已经拥有互斥量控制权的线程才能释放它,每释放一次该互斥量,它的持有计数就减1,当该互斥量的持有计数为零时(即持有线程已经释放所有的持有操作),它变为可用,等待在该信号量上的线程将被唤醒 

  > 013  事件信息标记

      如果信息标记同时设置了清除标记位,则当线程唤醒后将主动把事件标志清为零,否则事件标志将依然存在(即置1)

  > 014  事件与信号量的区别

      i. 事件的发送操作在事件未清除前,是不可累计的,而信号量的释放动作是累计的

      ii. 信号量只能识别单一的释放动作,而不能同时等待多种类型的释放

 

2018-01-20

  > 015  邮箱

      邮箱的单位是邮件,邮件大小固定为4Byte,这4Byte可以是数据(短数据情况),也可以是数据存储区的地址(大数据传送情况)

      邮箱可接收来自线程和中断服务的邮件,邮件内容是发送内容的一份拷贝

  > 016  消息队列

      能够将消息缓存至自己的内存区,并可接收来自线程和中断服务的消息,且消息长度任意

2018-05-29

  >017  内存管理

    1> 静态分区内存管理

      > 核心为分配若干大小一致的内存块组成的内存池,根据需要分配若干个这样的内存池

      > 这些内存池都是由分配它们的内存池控制块管理

      > 内存池结构为链表的形式

    2> 动态内存管理

      > 最好不要在中断服务程序中分配或释放动态内存块,这可能导致当前上下文被挂起等待

      a> 小内存管理算法(<2M)

      b> 大内存SLAB管理算法

原文地址:https://www.cnblogs.com/skullboyer/p/8285102.html