小编use*_*719的帖子

如何验证原子写入?

我已经努力搜索(在 S[O|F|U] 网络和其他地方),并认为这是一个不常见的问题。我正在使用运行 Debian Linux 2.6.28-4 的 Atmel AT91SAM9263-EK 开发板(ARM926EJ-S 内核,ARMv5 指令集)。我正在使用(我相信)tty 驱动程序与RS-485 串行控制器通信。我需要确保写入和读取是原子的。几行源代码(在本文末尾相对于内核源安装目录列出)暗示或隐含地说明了这一点。

有什么方法可以验证向/从该设备写入/读取实际上是原子操作吗?或者,/dev/ttyXX 设备是否被认为是 FIFO 并且参数在那里结束?仅仅相信代码正在执行它提出的这个声明似乎还不够——就在今年 2 月,freebsd 被证明缺乏小行的原子写入. 是的,我意识到 freebsd 与 Linux 并不完全相同,但我的观点是仔细确定并没有什么坏处。我能想到的就是继续发送数据并寻找排列 - 我希望有一些更科学的东西,理想情况下是确定性的。不幸的是,我对过去大学时代的并发编程课程一无所知。我会非常感谢在正确的方向上一记耳光或一推。如果您选择回复,请提前致谢。

亲切的问候,

杰斯


驱动程序/字符/tt​​y_io.c:1087

void tty_write_message(struct tty_struct *tty, char *msg)
{
    lock_kernel();
    if (tty) {
        mutex_lock(&tty->atomic_write_lock);
        if (tty->ops->write && !test_bit(TTY_CLOSING, &tty->flags))
            tty->ops->write(tty, msg, strlen(msg));
        tty_write_unlock(tty);
    }
    unlock_kernel();
    return;
}
Run Code Online (Sandbox Code Playgroud)


arch/arm/include/asm/bitops.h:37

static inline void ____atomic_set_bit(unsigned int bit, volatile unsigned long *p)
{
    unsigned long flags;
    unsigned long mask = 1UL …
Run Code Online (Sandbox Code Playgroud)

linux embedded arm atomic rs485

5
推荐指数
1
解决办法
1625
查看次数

标签 统计

arm ×1

atomic ×1

embedded ×1

linux ×1

rs485 ×1