---
# System prepended metadata

title: C4MRTOS問題整理

---

# 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 &ensp;Spi0Op_EnReg_p &ensp;&ensp;&ensp;  &SPCR
        - #define &ensp;Spi0Op_CS9Reg_p&ensp;&ensp;&ensp;&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 &ensp;&ensp;  &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) &ensp;  _MMIO_BYTE((io_addr) + __SFR_OFFSET)
    - #define _MMIO_BYTE(mem_addr) &ensp; (*(volatile uint8_t *)(mem_addr))
```
**偉晟_2022_10_18**

  
 

