打印
[LOOK]

LOOK for Cortex-M 发布帖

[复制链接]
楼主: john_lee
手机看帖
扫描二维码
随时随地手机跟帖
41
hotpower| | 2011-11-25 16:49 | 只看该作者 回帖奖励 |倒序浏览
安装gcc了吗?老师正准备升级,有兴趣可以和老师交流look,我们在QQ群12047788里交流。

使用特权

评论回复
42
hotpower| | 2011-12-1 14:32 | 只看该作者
正在测试新版本。

使用特权

评论回复
43
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方式发送消息,没有阻塞。


使用特权

评论回复
44
Swallow_0322| | 2011-12-3 13:12 | 只看该作者
LOOK又更新了,顶啊!

使用特权

评论回复
45
hotpower| | 2011-12-3 13:13 | 只看该作者
注意最新版本是:
“菜农 Cortex-M0 助学园地”社区预览版 20111018

使用特权

评论回复
46
lwslws201| | 2011-12-3 13:14 | 只看该作者
:victory:

使用特权

评论回复
47
john_lee|  楼主 | 2011-12-3 17:52 | 只看该作者
本帖最后由 john_lee 于 2011-12-17 14:53 编辑

LOOK 20111018 为 flag_t 增加了一种新的等待模式:LSB。
 
enum mode_t {
    ANY_KEEP,
    ANY_CONSUME,
    ALL_KEEP,
    ALL_CONSUME,
    LSB_KEEP,       // 新增
    LSB_CONSUME     // 新增
};
作用是,返回所等待的 pattern 的最低位,例如,当前 flag 为 0b110011110,当请求 pattern 为 0b1011011 时,原语返回 0b10:

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

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

private:
    struct blk_t { uint8_t data[80]; };
    blk_t buf[10];          // 内存资源
};

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

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

__INLINE void mempool_t::free(void* blk)
{
    // 可以先检查blk的合法性
    set_bits(1 << (reinterpret_cast<blk_t*>(blk) - &buf[0]));
}

使用特权

评论回复
48
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


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

谢谢!!!

使用特权

评论回复
49
haolaishi| | 2011-12-5 22:33 | 只看该作者
:lol

使用特权

评论回复
50
a305566| | 2011-12-6 08:27 | 只看该作者
mark

使用特权

评论回复
51
murex| | 2011-12-13 09:36 | 只看该作者
学习的好帖也得顶起来

使用特权

评论回复
52
lzb850125| | 2011-12-13 15:16 | 只看该作者
试试看 能不能回帖

使用特权

评论回复
53
lzb850125| | 2011-12-13 15:17 | 只看该作者
这是什么时间

使用特权

评论回复
54
zjsyjbb| | 2011-12-17 11:23 | 只看该作者
这个必须要顶...跟着老师学习..

使用特权

评论回复
55
mcs8098| | 2011-12-20 12:37 | 只看该作者
好东西:lol

使用特权

评论回复
56
athud| | 2012-1-4 15:02 | 只看该作者
李老师真厉害呀.!

使用特权

评论回复
57
触觉的爱| | 2012-5-8 23:40 | 只看该作者
太强大了,学习

使用特权

评论回复
58
hotpower| | 2012-5-17 09:02 | 只看该作者
59
mcs8098| | 2012-5-22 16:41 | 只看该作者
支持了,好帖子

使用特权

评论回复
60
杰式4231| | 2012-6-5 20:26 | 只看该作者
顶一下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则