我正在编写一个实用程序(恰好在python中),它以TCL脚本的形式生成输出.给定python中的一些任意字符串变量(不是unicode),我想生成一个类似的TCL行
set s something
Run Code Online (Sandbox Code Playgroud)
...将TCL变量' s
'设置为该精确字符串,无论其中包含什么奇怪的字符.没有变得太奇怪,我不想让输出比需要的更麻烦.我相信一个体面的方法
如果字符串不是空的并且只包含字母数字,而某些字符.-_
(但绝对不是$"{}\
)那么它可以原样使用;
如果它只包含可打印字符而没有双引号或花括号(并且不以反斜杠结尾),那么只需将{}
它放在一边;
否则,""
在使用\
转义后放置它"
{
}
\
$
[
]
,并\nnn
转义为非打印字符.
问题:是否需要在双引号内转义的完整字符集?我在文档中找不到这个.我是否错过了一些东西(我几乎错过了(2)的字符串不能以\结尾).
我知道还有许多其他字符串可以引用 {}
,但似乎很难轻易识别它们.此外,看起来非打印字符(特别是换行符)可以使用(2)如果您不介意它们确实存在于TCL输出中.
假设我正在修改内存映射 I/O 寄存器中的一些位,并且另一个进程或 ISR 可能正在修改同一寄存器中的其他位。
ldrex 和 strex 可以用来防止这种情况吗?我的意思是,他们原则上可以,因为您可以 ldrex,然后更改位,然后将其 strex 回来,如果 strex 失败,则意味着另一个操作可能已更改 reg,您必须重新开始。但是strex/ldrex机制可以用在不可缓存的区域吗?
我在树莓派上尝试过这个,将 I/O 寄存器映射到用户空间,并且 ldrex 操作给我一个总线错误。如果我将 ldrex/strex 更改为简单的 ldr/str 它可以正常工作(但不再是原子的......)此外,ldrex/strex 例程在普通 RAM 上也可以正常工作。指针是 32 位对齐的。
那么这是 strex/ldrex 机制的限制吗?或者 BCM2708 实现有问题,或者内核设置它的方式有问题?(或者其他东西——也许我映射错了)?