C最佳实践分配缓冲区[关闭]

问题描述 投票:0回答:1

我正在编写软件,以使用BSD套接字通过各种Web协议(TCP / UDP,MQTT,WebSocket,HTTP等)提供对微控制器UART端口的访问。我发现一个常见的主题是,每个处理器都需要使用自己的缓冲区来存储从套接字接收到的数据,然后再处理并发送到UART。

来自较高级别的编程背景,在分配这些缓冲区时,我仍然不确定最佳实践。

优缺点:

  1. 动态分配的全局/文件作用域static char *buffer;初始化的buffer = malloc(BUFFER_SIZE)
  2. 静态分配的全局/文件作用域static char buffer[BUFFER_SIZE]
  3. 静态分配的本地/功能范围char buffer[BUFFER_SIZE]
  4. 共享缓冲区管理系统(即,如果所有缓冲区的大小都相似,并且通常一次不能全部使用,则可以从缓冲区管理器中借用)

我知道:

  1. Pro:仅在必要时分配,例如协议可以被禁用。 Con:比静态分配要慢得多(但是在我来说,分配可能只发生一次)。
  2. Pro:预分配并包含在二进制文件中。 Con:运行时灵活性较差。
  3. Pro:使用比动态分配快得多的堆栈。 Con:需要足够的堆栈空间(?)。
  4. Pro:如果总是同时使用相似数量的缓冲区,可能会非常有效。 Con:本质上是根据需要简单使用malloc / free的更复杂的版本。

即使考虑了所有这些问题,似乎没有什么是显而易见的“最佳”解决方案,而且我已经看到在现有代码中,前3种用于各种组合。如果局部变量方法比动态分配要快得多,那么为什么每个函数都可以根据需要使用自己的缓冲区,为什么还要使用共享暂存缓冲区呢?当然,需要仔细考虑以避免每个函数都具有相同大缓冲区的10个函数,但是在某些情况下,这似乎是最简单的选择。

处理C中缓冲区的首选方法是什么,或者归结为个人喜好?

c memory-management embedded malloc buffer
1个回答
0
投票

[david说过,这不太可能是真正的“最佳实践”,但我可以告诉您在做串行工作时通常回用的内容。

如果您确定要在函数返回后不使用缓冲区,并且缓冲区不是很丑陋,那么就想到在堆栈中使用缓冲区。

Pro:快速分配,因为它在堆栈中。

Con:较大的堆栈空间(但在常规计算机上不是问题,但是您的系统的堆栈限制较小)吗?Con:如果函数返回后有数据输入,则可能会损坏内存。Con:无法将缓冲区返回给调用者。

函数uart_io(...){字符缓冲区[BUFFER_SIZE];bla_bla_bla();}

如果您想静态化,那么根据我阅读的内容,一个共享缓冲区似乎很有吸引力。

© www.soinside.com 2019 - 2024. All rights reserved.