当我申请一个具有 malloc 函数的存储器时、我发现它总是不成功。 为什么?


This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
当我申请一个具有 malloc 函数的存储器时、我发现它总是不成功。 为什么?


您好、Yaowu、
很抱歉耽误你的时间。 您真的需要在中断中进行 malloc 调用吗? 我不建议在中断中调用 malloc。 malloc 访问 程序使用的全局内存池。 如果您从两 个未同步的位置调用 malloc、则内存池会受到负面影响。 如果您绝对需要在中断中调用 malloc 并且正在其他地方调用 malloc、则需要确保将 malloc 调用打包以确保中断安全。
相反、我建议在中断中设置一个标志、以便在主程序中调用 malloc。
谢谢、
Jacob
您好、Wu、
中断时需要多大的存储器? 您是否需要将该存储器内的值从 ISR 中发送出去? 为什么不增加 ISR 的堆栈并使用堆栈中的存储器?
在 ISR 中使用 malloc 并不是一个好主意。 这种做法违反了所有建议。 在互联网上、您会发现很多人在讨论它是多么糟糕。
1月
您好!
也许 ISR 中的代码看起来是 malloc()简单而干净的,但这是地狱般的。 您似乎没有意识到有多少 CPU 周期花费了您简单的 malloc()调用,而您会惊讶于它如何破坏应用程序的时间行为。
我看不出为什么在 ISR 外部分配的队列使用内存与覆盖未处理数据相关的任何原因。 当 malloc()在堆或内存中没有足够的空间用于消息队列已满时没有区别。
内存池对象是更快分配内存的方法之一。 但最好还是避免在 ISR 内部进行动态内存分配。
1月
您好!
int mq_send (mqd_t mqdes、const char * msg_ptr、size_t msg_len、unsigned int msg_prio);
MQ_ Send ()仅将存储数据的第一个地址发送到队列,并非所有数据都逐个发送到队列。 我如何确保队列中的数据在每次被消耗之前不会被修改?
如何确保发送到队列的数据的第一个地址是消耗数据之前的新空间?
谢谢。
您好!
它复制您提供的内容。 TI-RTOS 或 FreeRTOS 可以使用消息队列和"任意"大小的消息、但例如 ThreadX 限制为16B。
int mq_send(mqd_t mqdes, const char *msg_ptr, size_t msg_len,
unsigned int msg_prio)
{
MQueueDesc *mqd = (MQueueDesc *)mqdes;
MQueueObj *msgQueue = mqd->msgQueue;
BaseType_t status;
TickType_t timeout;
if (msg_len > (size_t)(msgQueue->attrs.mq_msgsize)) {
if (!HwiP_inISR()) {
errno = EMSGSIZE;
}
return (-1);
}
/*
* If O_NONBLOCK is not set, block until space is available in the
* queue. Otherwise, return -1 if no space is available.
*/
if (mqd->flags & O_NONBLOCK) {
timeout = 0;
}
else {
timeout = portMAX_DELAY;
}
if (HwiP_inISR()) {
status = xQueueSendFromISR(msgQueue->queue, msg_ptr, NULL);
}
else {
status = xQueueSend(msgQueue->queue, msg_ptr, timeout);
}
if (status != pdTRUE) {
if (!HwiP_inISR()) {
errno = EAGAIN;
}
return (-1);
}
return (0);
}
1月