【发布时间】:2017-08-30 13:20:55
【问题描述】:
再说一次,我不是开发人员而是木工,所以我的问题可能很愚蠢。
我忘记了一些非常重要的事情,我必须使用 gcc-3.8 进行编译,因为我正在使用的原始代码无法使用新版本进行编译。我完全忘了谈这个,抱歉。
我正在将数据从工具发送到自主机器人。 机器人以无符号字符形式接收数据* 我读了很多,似乎 malloc 不是中断安全的。
由于机器人可能会做坏事和危险的事情,我会尽量确保每个部件的安全(至少尽可能)。
这个 malloc 发生在接收到的数据引发中断之后。 这个代码段现在让我很难让它安全,而且我的语法可能很糟糕..
char* _Xp = (char*) malloc(strlen((char*)_X)*sizeof(char));
strcpy(_Xp, (char*)_X);
1) malloc 真的不安全中断吗?我找到的信息是 2004 年的。
2) 有没有更有效的方法来初始化缓冲区?
3) 为什么 unsigned char “坏”? (阅读相关内容)。
4) 最后一个问题是 strcpy 也不安全中断吗?我读到的资料在这一点上有所不同。
===== 回答一些问题:
机器人没有操作系统,目标是 25Mhz 的 STR911FFM44(如果有帮助的话)
输入数组都是以 nul 结尾的。
代码不在中断处理程序中,而是在无限循环中,并且仅当 IrHandler 为其设置标志时才进行处理。
我不知道数据流对安全性“硬编码”的速率。但中断应该在 [500ms 到 1500ms] 内。
【问题讨论】:
-
我想你不知道
_X是否是nul-terminated,是吗?另外,malloc的返回也不需要强制转换,没有必要。有关详细说明,请参阅:Do I cast the result of malloc?。 -
(1) 您的信息是准确的——
malloc()是最不安全的例程之一。 (2) 不要在中断处理程序中进行内存分配。在您的主循环中,发现发生了中断,因此有数据要读取,然后分配缓冲区并读取数据。 (3) 如果您需要使用unsigned char,则没有特别的理由避免使用它。唯一需要注意的原因是库函数几乎都采用char *而不是unsigned char *,因此使用unsigned char会使事情变得冗长。 -
您有两个明智的选择,但它们都归结为在中断处理程序中做的工作更少。首先,您可以为中断处理程序设置一个缓冲区,并使用单独的代码来填充中断处理程序的缓冲区供应。其次,您可以让中断处理程序只告诉其他非中断代码来处理需要处理的任何内容。本质上,在中断处理程序中做的越少越好,而且你绝对不需要在其中分配内存,因为这可以随时完成。
-
没有愚蠢的问题。你是一名木工与你的帖子质量无关,主要是因为你做的研究比今天的新手“专业”程序员平均做的多。
-
你可以通过说“唯一愚蠢的问题是那些没有被问到的问题”来稍微限定一下。
:)如果@A.albin 将第一段代码写到auto-square my Beismeir Fence System,我将是第一个使用它的人......
标签: c embedded microcontroller interrupt