繁体   English   中英

了解头文件中的函数定义

[英]Understanding a function definition in a header file

我正在将写到特定微控制器的软件移植到另一个微控制器,但是使用C语言时遇到问题。

我想提请注意hal_spi_rf_trxeb.c文件中定义的以下提到的函数。 尽管我在文件中搜索,但无法找到以下功能的完整功能说明。

  1. TRXEM_SPI_WAIT_DONE()

  2. TRXEM_SPI_RX()

  3. TRXEM_SPI_WAIT_DONE()

  4. TRXEM_SPI_WAIT_TX_DONE()

  5. TRXEM_SPI_RX()

  6. 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()是什么?

如果您需要,可以通过此链接下载整个项目。

有关更多信息,您可以查看链接的头文件和源文件( .h.c )。

正如您已经说过的那样,这些不是函数而是宏。 您可以在gcc手册中阅读有关宏的信息。

宏是已命名的代码片段。 每当使用该名称时,它就会被宏的内容替换。

那是总结。 除此之外,还有很多细节。 但是对于初学者来说,您可以将宏视为代码替换规则。 宏在编译器完成其工作之前由预处理器扩展。

一个简单的例子:

#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 )。

这些不是函数而是宏。 宏基本上已由它们在编译(预处理)之前表示的代码替换。

可以在头文件上定义和重新定义宏。

st()函数未在上下文中编写,因此不确定其作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM