[LOOK] LOOK for Cortex-M 发布帖

[复制链接]
hotpower 发表于 2011-11-25 16:49 | 显示全部楼层
安装gcc了吗?老师正准备升级,有兴趣可以和老师交流look,我们在QQ群12047788里交流。
hotpower 发表于 2011-12-1 14:32 | 显示全部楼层
正在测试新版本。
hotpower 发表于 2011-12-2 16:06 | 显示全部楼层
李老师授课
用户数据长度不够4字节的,可以扩展到4字节,就可以使用邮箱传递了,但要考虑效率问题,4字节的数据,效率是100%,2字节的数据,效率只有50%,单字节的数据,效率只有25%。
大于4字节的数据,一般不采用直接传递数据本身,而是把数据的地址(指针)作为消息来传递。
也可以采用拆分数据的方法,把大数据分成小块从邮箱传递,但这种方法需要考虑多方面的问题,如抢断、邮箱满等情况。
对于消息数据的类型来说,由于传统的邮箱发送和接收函数只能接受固定的数据类型(一般是void*),所以用户的数据类型,需要在本身的类型和固定类型之间强制转换(发送时强制为void*,接收时强制回用户类型),这样做,除了麻烦外,也是一种隐患。
而look由于是基于c++的RTOS,比较容易地解决了这个问题,mbox_t设计为模板类,用户的消息类型需要在邮箱创建时,以模板参数的形式给出,并且消息的发送和接收函数,也会只接受这种用户类型的消息,这就避免了传统的强制的方法,不仅优雅,而且是类型安全的。
下面具体说下mbox_t的使用方法:
首先要创建邮箱实例,上面说了,需要给出用户消息类型和邮箱容量作为创建时的模板参数,语法形式为:
mbox_t<用户消息类型,邮箱容量> 邮箱实例名;
使用邮箱发送和接收消息,有一个限制:不允许在调度器尚未运转之前,这些地方位于:
1、构造函数,当创建全局对象时。
2、LOOK_HWINIT()函数。
发送消息使用mbox_t::put()函数,put()函数的原型为:
bool put(T msg, uintptr_t timeout = 0);
T是用户消息类型,msg是消息实体,timeout是超时限制。
put()函数还有其他几种形式:
bool tryput(T msg);
非阻塞地发送消息。
bool tryput_front(T msg);
非阻塞地以lifo方式发送消息。
bool put_front(T msg, uintptr_t timeout = 0);
以lifo方式发送消息。
bool do_tryput(T msg);
在调度器已锁定的情况下,发送消息,没有阻塞。
bool do_tryput_front(T msg);
在调度器已锁定的情况下,以lifo方式发送消息,没有阻塞。

Swallow_0322 发表于 2011-12-3 13:12 | 显示全部楼层
LOOK又更新了,顶啊!
hotpower 发表于 2011-12-3 13:13 | 显示全部楼层
注意最新版本是:
“菜农 Cortex-M0 助学园地”社区预览版 20111018
lwslws201 发表于 2011-12-3 13:14 | 显示全部楼层
:victory:
 楼主| john_lee 发表于 2011-12-3 17:52 | 显示全部楼层
本帖最后由 john_lee 于 2011-12-17 14:53 编辑

LOOK 20111018 为 flag_t 增加了一种新的等待模式:LSB。

  1. enum mode_t {
  2.     ANY_KEEP,
  3.     ANY_CONSUME,
  4.     ALL_KEEP,
  5.     ALL_CONSUME,
  6.     LSB_KEEP,       // 新增
  7.     LSB_CONSUME     // 新增
  8. };
作用是,返回所等待的 pattern 的最低位,例如,当前 flag 为 0b110011110,当请求 pattern 为 0b1011011 时,原语返回 0b10:

  1. flag_t flag(0b110011110);    // flag 初值
  2. ...
  3. int ev = flag.wait(0b1011011, flag_t:LSB_CONSUME);  // ev == 0b10
这个等待模式类似于 ANY 模式,不同的是 ANY 模式会返回所有满足 pattern 的位,而 LSB 模式只返回满足 pattern 的最低位。
LSB 模式可用于一些特殊场合,例如:管理一组按数组结构排列好的共享资源,资源最多 32 个,当应用程序(任务)来请求资源时,分配其中一个未用资源,并将其资源地址返回给任务。
下面给出一个非常简单的固定大小内存池的管理例程:

  1. class mempool_t : flag_t {
  2. public:
  3.     __INLINE mempool_t();
  4.     __INLINE void* alloc(uintptr_t timeout = 0);    // 分配
  5.     __INLINE void free(void* blk);                  // 释放

  6. private:
  7.     struct blk_t { uint8_t data[80]; };
  8.     blk_t buf[10];          // 内存资源
  9. };

  10. __INLINE mempool_t::mempool_t()
  11. : flag_t((1 << 10) - 1)           // 10 块的 bitmap
  12. {
  13. }

  14. __INLINE void* mempool_t::alloc(uintptr_t timeout)
  15. {
  16.     uintptr_t lsb = wait(~0, LSB_CONSUME, timeout);
  17.     return lsb != 0 ? &buf[ctz(lsb)] : 0;
  18. }

  19. __INLINE void mempool_t::free(void* blk)
  20. {
  21.     // 可以先检查blk的合法性
  22.     set_bits(1 << (reinterpret_cast<blk_t*>(blk) - &buf[0]));
  23. }
hotpower 发表于 2011-12-4 23:11 | 显示全部楼层
LOOK 20111018 为 flag_t 增加了一种新的等待模式:LSB。
enum mode_t {
    ANY_KEEP,
    ANY_CONSUME,
    ALL_KEEP,
    ALL_CONSUME,
    LSB_KEEP,       // 新增
    LSB_CONSUME     // 新增
};
作用是,返 ...
john_lee 发表于 2011-12-3 17:52


老师,可否您上传个例程??

谢谢!!!
haolaishi 发表于 2011-12-5 22:33 | 显示全部楼层
a305566 发表于 2011-12-6 08:27 | 显示全部楼层
murex 发表于 2011-12-13 09:36 | 显示全部楼层
学习的好帖也得顶起来
lzb850125 发表于 2011-12-13 15:16 | 显示全部楼层
试试看 能不能回帖
lzb850125 发表于 2011-12-13 15:17 | 显示全部楼层
这是什么时间
zjsyjbb 发表于 2011-12-17 11:23 | 显示全部楼层
这个必须要顶...跟着老师学习..
mcs8098 发表于 2011-12-20 12:37 | 显示全部楼层
好东西:lol
athud 发表于 2012-1-4 15:02 | 显示全部楼层
李老师真厉害呀.!
触觉的爱 发表于 2012-5-8 23:40 | 显示全部楼层
太强大了,学习
hotpower 发表于 2012-5-17 09:02 | 显示全部楼层
mcs8098 发表于 2012-5-22 16:41 | 显示全部楼层
支持了,好帖子
杰式4231 发表于 2012-6-5 20:26 | 显示全部楼层
顶一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部