我正在将写入特定微控制器的软件移植到另一台微控制器,但我遇到了C语言问题。
我想提请注意hal_spi_rf_trxeb.c文件中定义的下面提到的函数。虽然我在文件中搜索,但我无法找到以下功能的完整功能描述。
TRXEM_SPI_WAIT_DONE()
TRXEM_SPI_RX()
TRXEM_SPI_WAIT_DONE()
TRXEM_SPI_WAIT_TX_DONE()
TRXEM_SPI_RX()
TRXEM_SPI_WAIT_MISO_LOW(x)
经过一番搜索后,我发现这些函数存在于头文件本身中。更具体地说,inhal_spi_rf_trxeb.h
文件。
/******************************************************************************
* @fn trx16BitRegAccess
*
* @brief This function performs a read or write in the extended adress
* space of CC112X.
*
* input parameters
*
* @param accessType - Specifies if this is a read or write and if it's
* a single or burst access. Bitmask made up of
* RADIO_BURST_ACCESS/RADIO_SINGLE_ACCESS/
* RADIO_WRITE_ACCESS/RADIO_READ_ACCESS.
* @param extAddr - Extended register space address = 0x2F.
* @param regAddr - Register address in the extended address space.
* @param *pData - Pointer to data array for communication
* @param len - Length of bytes to be read/written from/to radio
*
* output parameters
*
* @return rfStatus_t
*/
rfStatus_t trx16BitRegAccess(uint8 accessType, uint8 extAddr, uint8 regAddr, uint8 *pData, uint8 len)
{
uint8 readValue;
<span style="background-color:#ff0000;">TRXEM_SPI_BEGIN();</span>
while(TRXEM_PORT_IN & TRXEM_SPI_MISO_PIN);
/* send extended address byte with access type bits set */
<span style="background-color:#ff0000;"> TRXEM_SPI_TX</span>(accessType|extAddr);
TRXEM_SPI_WAIT_DONE();
/* Storing chip status */
readValue = TRXEM_SPI_RX();
TRXEM_SPI_TX(regAddr);
TRXEM_SPI_WAIT_DONE();
/* Communicate len number of bytes */
trxReadWriteBurstSingle(accessType|extAddr,pData,len);
hal_spi_rf_trxeb.h
声称拥有我正在以宏的形式搜索的功能。这些宏如下所示。
/******************************************************************************
* MACROS
*/
/* Macros for Tranceivers(TRX) */
#define TRXEM_SPI_BEGIN() st( TRXEM_PORT_OUT &= ~TRXEM_SPI_SC_N_PIN; NOP(); )
#define TRXEM_SPI_TX(x) st( UCB0IFG &= ~UCRXIFG; UCB0TXBUF= (x); )
#define TRXEM_SPI_WAIT_DONE() st( while(!(UCB0IFG & UCRXIFG)); )
#define TRXEM_SPI_WAIT_TX_DONE() st( while(!(UCB0IFG & UCTXIFG)); )
#define TRXEM_SPI_RX() UCB0RXBUF
#define TRXEM_SPI_WAIT_MISO_LOW(x) st( uint8 count = 200; \
while(TRXEM_PORT_IN & TRXEM_SPI_MISO_PIN) \
{ \
__delay_cycles(5000); \
count--; \
if (count == 0) break; \
} \
if(count>0) (x) = 1; \
else (x) = 0; )
我不明白这些宏是如何工作的。
有人可以告诉我如何在头文件中定义一个函数吗?
如何在头文件中定义函数?
st()
函数的作用是什么?
如果您需要,可以通过this link下载整个项目。
有关详细信息,您可以查看链接的标题和来源(.h
和.c
)文件。
答案 0 :(得分:0)
正如您已经说过的,那些不是功能,而是宏。您可以在gcc manual中阅读有关宏的信息。
宏是代号的片段,它已被赋予名称。每当 使用该名称,它将被宏的内容替换。
这是摘要。除此之外还有更多细节。但对于初学者,您可以将宏视为代码替换规则。在编译器执行它之前,宏由预处理器进行扩展。
一个简单的例子:
#define MY_PRINT_MACRO(string1, string2) printf("%s %s\n", string1, string2)
MY_PRINT_MACRO("hello", "world");
预处理器会将第二行更改为:
printf("%s %s\n", "hello", "world");
这正是编译器将看到的内容(它根本看不到MY_PRINT_MACRO
。)
答案 1 :(得分:0)
这些不是功能,而是宏。在编译(预处理)之前,宏基本上被它们代表的代码所取代。
可以在头文件上定义和重新定义宏。
st()函数不会在上下文中写入,因此不确定它的作用。