# C4MRTOS問題整理 1. 全域變數中,不能直接==變數=變數==宣告,在C語言全域變數只能使用==常數==宣告,假釋要使用可以用#define,所以在_Sam_....檔案裡 ```c RTSpiSwapStr_t RTSpiSwap0_str = {.DataReg_p = Spi0Op_str.DataReg_p, .IntSetReg_p = Spi0Op_str.IntSetReg_p, .IntSetMask = Spi0Op_str.IntSetMask, .IntSetshift = Spi0Op_str.IntSetShift, ..... ``` 都修正,修正_Sam_...結構、RTS...的.c與.h裡的lay部分。 **偉晟_2022_08_24** ------ 2. 問題 - 將原先mcu設定好的暫存器名稱(如:PORTx),在用 #define 重新定義名稱,並且對暫存取數值如下: - #define  Spi0Op_EnReg_p     &SPCR - #define  Spi0Op_CS9Reg_p   &PORTF - **編譯器錯誤訊息error:** initialization of 'unsigned char' from 'volatile uint8_t *' {aka 'volatile unsigned char *'} makes integer from pointer without a cast [-Wint-conversion] ==65 | #define Spi0Op_DataReg_p    &SPDR== - **提出警告問題** - 在Preprocessce裡是否有 ==&== 當成address of object 還是只會認定為 Bitwise中的 AND - 在底層 mem_addr 型態修飾加入 volatile ,而在C語言規定,似乎volatile只能對設有volatile取數值 - **程式碼展開** ```c - #define Spi0Op_IntEnReg_p &SPCR - #define SPCR _SFR_IO8(0x0D) - #define _SFR_IO8(io_addr)   _MMIO_BYTE((io_addr) + __SFR_OFFSET) - #define _MMIO_BYTE(mem_addr)   (*(volatile uint8_t *)(mem_addr)) ``` **偉晟_2022_10_18**