本人用過三星單片機如S3F9488、S3F9454、S3F9498,以前一直是用匯編編程OPENICE-I500,現(xiàn)在改用C,遇到幾個小問題已解決的或未解決的,希望能與各位聊聊,以增加對C語言的了解.
1、頭文件:S3F9488的頭文件用ioS3C9488.h,因為S3F9488與S3C9488的規(guī)格書是相同的只是前者是FLASH,后者是OTP,
2、編譯后.lst文件會有如AND 0xDF,#252的語句,從語句分析是編譯器指向PAGE0,但實際我沒有用到PAGE1,一直是在PAGE0操作.(只針對9488,其它不知是否也會)
如果各位有匯編或C語言的問題,請?zhí)岢?我盡力給你答復
Samsung單片機C語言(IAR)應用
全部回復(8)
正序查看
倒序查看
先自頂
以下是一段24C02的程序
void AT24CXX_WriteFullPage( unsigned int wAddress , unsigned char* pBuffer )
{
unsigned char ucVar;
while ( AT24CXX_Enabled() == FALSE );
AT24CXX_Start();
AT24CXX_SetWriteAddress( wAddress );
for ( ucVar = 0 ; ucVar < AT24CXX_PAGESIZE ; ucVar ++ )
AT24CXX_Write( pBuffer[ ucVar ] );
AT24CXX_Stop();
}
/******************************************************************************/
下面是編譯后的.lst文件
\ In segment CODE, align 1, keep-with-next
193 void AT24CXX_WriteFullPage( unsigned int wAddress , unsigned char* pBuffer )
\ AT24CXX_WriteFullPage:
\ 0000 REQUIRE __INIT_STACK
194 {
\ 0000 ; * Stack frame (at entry) *
\ 0000 ; Param size: 0
\ 0000
\ 0000 70C9 PUSH R9
\ 0002 70C8 PUSH R8
\ 0004 70C7 PUSH R7
\ 0006 70C6 PUSH R6
\ 0008 ; Saved register size: 4
\ 0008 ; Auto size: 0
\ 0008 68CE LD R6,R14
\ 000A 78CF LD R7,R15
\ 000C 88CC LD R8,R12
\ 000E 98CD LD R9,R13
195 unsigned char ucVar;
196
197 while ( AT24CXX_Enabled() == FALSE );
\ ??AT24CXX_WriteFullPage_0:
\ 0010 ; Setup parameters for call to function AT24CXX_Enabled
\ 0010 F6.... CALL AT24CXX_Enabled
\ 0013 42FF OR R15,R15
\ 0015 6BF9 JR Z,??AT24CXX_WriteFullPage_0
198 AT24CXX_Start();
\ 0017 ; Setup parameters for call to function AT24CXX_Start
\ 0017 F6.... CALL AT24CXX_Start
199 AT24CXX_SetWriteAddress( wAddress );
\ 001A ; Setup parameters for call to function AT24CXX_SetWriteAddress
\ 001A E8C6 LD R14,R6
\ 001C F8C7 LD R15,R7
\ 001E F6.... CALL AT24CXX_SetWriteAddress
200 for ( ucVar = 0 ; ucVar < AT24CXX_PAGESIZE ; ucVar ++ )
\ 0021 B0C7 CLR R7
\ 0023 8B12 JR ??main_4
201 AT24CXX_Write( pBuffer[ ucVar ] );
\ ??AT24CXX_WriteFullPage_1:
\ 0025 ; Setup parameters for call to function AT24CXX_Write
\ 0025 E8C8 LD R14,R8
\ 0027 F8C9 LD R15,R9
\ 0029 02F7 ADD R15,R7
\ 002B 44CEDF OR 0xDF,R14
\ 002E C7FF LD R15,@R15
\ 0030 56DFFC AND 0xDF,#252
\ 0033 F6.... CALL AT24CXX_Write
\ 0036 7E INC R7
\ ??main_4:
\ 0037 A6C708 CP R7,#8
\ 003A 7BE9 JR ULT,??AT24CXX_WriteFullPage_1
202 AT24CXX_Stop();
\ 003C ; Setup parameters for call to function AT24CXX_Stop
\ 003C F6.... CALL AT24CXX_Stop
203 }
\ 003F 50C6 POP R6
\ 0041 50C7 POP R7
\ 0043 50C8 POP R8
\ 0045 50C9 POP R9
\ 0047 AF RET
\ 0048 REQUIRE ?CLSAM8_2_L00
204 /******************************************************************************/
205
問題就在于有AND 0xDF,#252的行,還有就是入棧,這并不是在中斷,可是卻有入棧?哪位高手來講述一下.
以下是一段24C02的程序
void AT24CXX_WriteFullPage( unsigned int wAddress , unsigned char* pBuffer )
{
unsigned char ucVar;
while ( AT24CXX_Enabled() == FALSE );
AT24CXX_Start();
AT24CXX_SetWriteAddress( wAddress );
for ( ucVar = 0 ; ucVar < AT24CXX_PAGESIZE ; ucVar ++ )
AT24CXX_Write( pBuffer[ ucVar ] );
AT24CXX_Stop();
}
/******************************************************************************/
下面是編譯后的.lst文件
\ In segment CODE, align 1, keep-with-next
193 void AT24CXX_WriteFullPage( unsigned int wAddress , unsigned char* pBuffer )
\ AT24CXX_WriteFullPage:
\ 0000 REQUIRE __INIT_STACK
194 {
\ 0000 ; * Stack frame (at entry) *
\ 0000 ; Param size: 0
\ 0000
\ 0000 70C9 PUSH R9
\ 0002 70C8 PUSH R8
\ 0004 70C7 PUSH R7
\ 0006 70C6 PUSH R6
\ 0008 ; Saved register size: 4
\ 0008 ; Auto size: 0
\ 0008 68CE LD R6,R14
\ 000A 78CF LD R7,R15
\ 000C 88CC LD R8,R12
\ 000E 98CD LD R9,R13
195 unsigned char ucVar;
196
197 while ( AT24CXX_Enabled() == FALSE );
\ ??AT24CXX_WriteFullPage_0:
\ 0010 ; Setup parameters for call to function AT24CXX_Enabled
\ 0010 F6.... CALL AT24CXX_Enabled
\ 0013 42FF OR R15,R15
\ 0015 6BF9 JR Z,??AT24CXX_WriteFullPage_0
198 AT24CXX_Start();
\ 0017 ; Setup parameters for call to function AT24CXX_Start
\ 0017 F6.... CALL AT24CXX_Start
199 AT24CXX_SetWriteAddress( wAddress );
\ 001A ; Setup parameters for call to function AT24CXX_SetWriteAddress
\ 001A E8C6 LD R14,R6
\ 001C F8C7 LD R15,R7
\ 001E F6.... CALL AT24CXX_SetWriteAddress
200 for ( ucVar = 0 ; ucVar < AT24CXX_PAGESIZE ; ucVar ++ )
\ 0021 B0C7 CLR R7
\ 0023 8B12 JR ??main_4
201 AT24CXX_Write( pBuffer[ ucVar ] );
\ ??AT24CXX_WriteFullPage_1:
\ 0025 ; Setup parameters for call to function AT24CXX_Write
\ 0025 E8C8 LD R14,R8
\ 0027 F8C9 LD R15,R9
\ 0029 02F7 ADD R15,R7
\ 002B 44CEDF OR 0xDF,R14
\ 002E C7FF LD R15,@R15
\ 0030 56DFFC AND 0xDF,#252
\ 0033 F6.... CALL AT24CXX_Write
\ 0036 7E INC R7
\ ??main_4:
\ 0037 A6C708 CP R7,#8
\ 003A 7BE9 JR ULT,??AT24CXX_WriteFullPage_1
202 AT24CXX_Stop();
\ 003C ; Setup parameters for call to function AT24CXX_Stop
\ 003C F6.... CALL AT24CXX_Stop
203 }
\ 003F 50C6 POP R6
\ 0041 50C7 POP R7
\ 0043 50C8 POP R8
\ 0045 50C9 POP R9
\ 0047 AF RET
\ 0048 REQUIRE ?CLSAM8_2_L00
204 /******************************************************************************/
205
問題就在于有AND 0xDF,#252的行,還有就是入棧,這并不是在中斷,可是卻有入棧?哪位高手來講述一下.
0
回復