demo-ptr.c

来自「FreeRTOS 是一个源码公开的免费的嵌入式实时操作系统」· C语言 代码 · 共 105 行

C
105
字号
// POINTERS AND INDEXED TABLES

#pragma chip PIC18C252


char tab1[10];
char tab2[10];

bank2 uns24 tu2[10];
bank3 uns24 tu3[10];
uns24 *px;


void pointers( void)
{
    // p1 is 8 bit wide
    char *p1 = tab1;
    char s = 0;

    do
       s += *p1 & 3;
    while (++p1 < &tab1[10]);

    // px is 16 bit wide because it can access elements from 2 banks
    px = tu2;
    px = &tu3[9];
    uns24 e = *px;


    // low level pointer access
    FSR0 = &tab1[1];
    FSR1 = &tab2[0];
    char a = 10-1;
    do  {
        POSTINC0 = POSTINC1; // *FSR0++ = *FSR1++;
    } while (--a > 0);

    char *px, i;
    i = *px;

    i = *FSR0;   // MOVFF INDF0,i
    i = *FSR0++; // MOVFF POSTINC0,i
    i = *FSR0--; // MOVFF POSTDEC0,i
    i = *++FSR0; // MOVFF PREINC0,i
    i = *--FSR0; // MOVF  POSTDEC0,W,0 ,  MOVFF INDF0,i
}


typedef struct {
  uns16 ab;
  struct {
    uns8 l1;
    uns8 l2;
  } vx;
} Txx;

Txx ax, bx[2], *pxx;

void sub( void)
{
    pxx = &ax;
    ax.ab = 1000;
    pxx->vx.l1 = 3;

    pxx = &bx[0];
    pxx->ab = 0;
    pxx ++;
    pxx->vx.l2 = 0;
}


/* An array that need to cross page boundaries can optionally be
   assigned a specific start address. This start address is only
   required when the array is less than 257 bytes and need to cross
   a 256 byte boundary. */

uns16 large[256] @ 0x400;  // bank 4 and 5

size2 uns16 *lp;

uns16 sub2( void)
{
    if (++lp >= &large[256])
        lp = &large[0];
    return *lp;
}

uns16 sub3( void)
{
    return *lp;
}


void main(void)
{
    pointers();
    sub();

    lp = &large[0];
    uns16 z = sub2();
    z += sub3();
}


⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?