了解头文件中的函数定义

时间:2015-05-07 10:54:03

标签: c

我正在将写入特定微控制器的软件移植到另一台微控制器,但我遇到了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)

  7. 经过一番搜索后,我发现这些函数存在于头文件本身中。更具体地说,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)文件。

2 个答案:

答案 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()函数不会在上下文中写入,因此不确定它的作用。