mac*_*ko' 1 c pointers pointer-arithmetic msp430 iar
我用IAR EBW编程msp430.
我的表达式如下:
adres = (uint_fast16_t *) 0x8602 + (0x0200*i);
Run Code Online (Sandbox Code Playgroud)
在for循环中,以便我随着每个循环增加.出于某种原因,它会跳过两个地址中的每一个并给我:
0x8602
0x8A02
0x8E02
Run Code Online (Sandbox Code Playgroud)
等等.因此跳过0x8802,也就是0x8C02等等.
为什么会这样?
////下面是完整代码,请注意我被放置在三个循环中,每个人都给出相同的结果.////还要注意在调试时检查时显示为:1,2,3 ......等
#include "io430.h"
#include <stdint.h>
int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
// Inicjalizuj piny GPIO
P3OUT &= ~(BIT4+BIT5); // zeruj warto?ci by zapobiec krótkotrwa?ym impulsom
P3DIR |= BIT4; // ustaw pin3.4 UCA0TXD oraz piny 3.0 CS, 3.1 SIMO, 3.3 CLK jako wyj?cie
P3DIR &= ~(BIT5); // ustaw pin3.5 UCA0RXD oraz 3.2SOMI jako wej?cie
P3SEL |= BIT4+BIT5; // daj funkcje TXD i RXD pinom 3.4 i 3.5, funkcje SIMO,SOMI,CLK pinom 3.1,3.2,3.3
// Inicjalizuj ustawienia zegarów BCS
BCSCTL1 = CALBC1_16MHZ; // ustawia DCO na 16MHz, wy??cz XT2, LFXT1 w trybie niskiej cz?stotliwo?ci
DCOCTL = CALDCO_16MHZ; // ustawia DCO na 16MHz
BCSCTL2 |= BIT2; // ustawia dzielnik SMCLK na 4
// Ustaw flash na czyszczenie segmentów
while(FCTL3&BIT0); // czekaj a? b?dzie mo?na inicjalizowa?
FCTL2 = FWKEY + BIT6 + BIT5+BIT3+BIT2; // ustawia ?ród?o zegara na MCLK oraz jego dzielnik daj?cy f = 363 kHz
FCTL1 = FWKEY + BIT1; // czy?? indywidualne segmenty
FCTL3 = FWKEY; // zdejmuje blokad? na pisanie i czyszczenie (tu segmentów)
// Czy?? segmenty
uint_fast16_t *adres;
uint_fast8_t i=0;
for ( i=0 ; i < 59; i++)
{
adres = (uint_fast16_t *) 0x8602 + i*0x0200; // ustawia wska?nik na kolejne miejsa w pami?ci. sprawdzi?!!
*adres = 0; // wyczy?? segment przez wpisanie w jego komórk? g?upiego bitu
while(FCTL3&BIT0); // poczekaj a? generator czasowy dla flasha
}
FCTL1 = FWKEY; // blokuje mo?liwo?? czyszczenia
__delay_cycles(65000);
// Ustaw flash na zapis danych
while(FCTL3&BIT0); // czekaj a? b?dzie mo?na pisa?
FCTL1 = FWKEY + BIT6; // pozwól pisa? do flash
// Pisz do flash
uint_fast16_t szesnastka = 0;
for ( i=0 ; i < 59; i++)
{
szesnastka = (0x55 << 8 ) | 0xF0;
adres = (uint_fast16_t *) 0x8602 + (0x0200*i); // ustawia wska?nik na kolejne miejsa w pami?ci. sprawdzi?!!
*adres = szesnastka; // wyczy?? segment przez wpisanie w jego komórk? g?upiego bitu
while(FCTL3&BIT0); // poczekaj a? generator czasowy dla flasha
}
FCTL1 = FWKEY; // blokuje mo?liwo?? pisania
FCTL3 = FWKEY + LOCK; // ustawia blokad? na pisanie i czyszczenie
__delay_cycles(65000);
// Inicjalizuj ustawienia do transmisji UART
UCA0CTL0 = 0x00; // ustawia domy?lne parametry protoko?u
UCA0CTL1 |= BIT7+BIT6; // ustawia ?ród?o sygna?u na SMCLK
UCA0BR0 = 0xA0; // ustawia dzielnik 4MHz do baud rate 9600
UCA0BR1 = 0x01; // ustawia dzielnik 4MHz do baud rate 9600
UCA0MCTL |= BIT2+BIT3; // ustawia modulacje zegara do baud rate 9600
UCA0CTL1 &= ~UCSWRST; // w??cza maszyn? USCI
uint8_t *ptr;
// Wy?lij wszystkie wyniki poprzez UART
for( i=0 ; i < 59 ; i++ )
{
ptr = (uint8_t *) 0x8602 + i*0x0200; // ustawia wska?nik na kolejne miejsa w pami?ci.
while(!(IFG2&UCA0TXIFG)); // czeka na mo?liwo?? wys?ania
UCA0TXBUF = *ptr; // wysy?a dane przez UART
ptr++;
while(!(IFG2&UCA0TXIFG)); // czeka na mo?liwo?? wys?ania
UCA0TXBUF = *ptr; // wysy?a dane przez UART
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
您将第一个值转换为指向16位值的指针,因此添加0x200将向前移动512个16位(或2个字节)值.
如果你这样做:
adres = (uint_fast32_t *) 0x8602 + (0x0200 * i ) ;
Run Code Online (Sandbox Code Playgroud)
它会做:
0x8602
0x8E02
0x9202
Run Code Online (Sandbox Code Playgroud)
要么缩放一半,要么在演员之前做数学:
adres = ( uint_fast16_t *) ( 0x8602 + ( 0x0200 * i ) ) ;
Run Code Online (Sandbox Code Playgroud)