我开发了一个名为dataframe的小型库,它接收一个缓冲区,并对其进行编码以进行uart通信。 dataframe的输出传递给uart tx函数的输入。我开发了数据帧作为自己的迷你静态库,因此可以进行单元测试,因此我将回调函数定义为其输出接口。
我的问题是我正在运行期间通过使用一个名为DF_write_cb的函数指针将数据帧的输出挂接到uart tx处理程序,如下所示:
void main(...){
DF_set_write_callback(Uart_Tx_String, NULL);
...
}
void DF_apply_frame(uint8_t* buff, size_t len)
{
uint16_t calc_fletcher = fletcher16(buff, len);
buff[len] = (calc_fletcher>>0) & 0xFF;
buff[len+1] = (calc_fletcher>>8) & 0xFF;
len+=2;
uint8_t s=DF_START_BYTE;
DF_write_cb(&s, 1);
DF_escape_frame(buff, len);
s=DF_STOP_BYTE;
DF_write_cb(&s, 1);
}
DF_write_cb指向:
bool OPTIMIZE(O3) Uart_Tx_String(uint8_t* string, size_t string_size)
{
if(string == NULL || string_size <= 0)
{
return true;
}
...
...
}
有没有更好的方法来解决这个问题?我知道我希望数据帧在编译时将其处理后的字节传递给什么函数,当然是在链接时。
真的,我正在寻找一种告诉gcc“DF_write_cb()”真的是“Uart_Tx_String()”的方法。如果可能的话,我想避免#define。是否有任何我不知道的配置方法会让编译器或链接器用“Uart_Tx_String”替换“DF_write_cb”?我已经看到一些静态内联的引用,但我不熟悉如何设置它。