亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? xmemtest.c

?? 含有完整TCP/IP PPP協(xié)議的嵌入式操作系統(tǒng)
?? C
字號:
#include <string.h>#include <stdio.h>#include "utils.h"#include "uart.h"#include "xmemtest.h"extern u_char GetChar(void);#define MERR_BAD_ADDR       1#define MERR_BAD_DATA       2#define MERR_STICKY_WRITE   3#define MERR_STICKY_READ    4#define MERR_STICKY_ALE     5#define MERR_STICKY_DATABUS 6#define MERR_STICKY_ADDRBUS 7#define MERR_SHORT_DATABUS  8#define MERR_SHORT_ADDRBUS  9static int merr;static u_char merr_bits;static void *merr_addr;/* PORTA: AD0..7 *//* PORTC: A8..15 *//* * PG0: \WR * PG1: \RD * PG2: ALE * PG3: TOSC2 * PG4: TOSC1 *//*! * \brief Disable external memory interface. * * On return, control bus signals are high and address * and data bus are low. */void XMemDisable(void){    /* Disable external memory bus. */#if defined(__AVR_AT90CAN128__)    cbi(XMCRA, SRE);#else    cbi(MCUCR, SRE);#endif#ifdef __AVR_ENHANCED__    /* Disable write signal. */    sbi(PORTG, PORTG0);    sbi(DDRG, PORTG0);    /* Disable read signal. */    sbi(PORTG, PORTG1);    sbi(DDRG, PORTG1);    /* Set ALE high, which makes latch transparent. */    sbi(PORTG, PORTG2);    sbi(DDRG, PORTG2);#endif    /* Set latch register to zero. */    outb(PORTA, 0);    outb(DDRA, 0xFF);#ifdef __AVR_ENHANCED__    cbi(PORTG, PORTG2);    sbi(PORTG, PORTG2);#endif    /* Set high address bus to zero. */    outb(PORTC, 0);#ifdef __AVR_ENHANCED__    outb(DDRC, 0xFF);#endif}#ifdef __AVR_ENHANCED__void XMemLatch(u_char val){    /* Port A is connected to latch inputs. */    outb(PORTA, val);    outb(DDRA, 0xFF);    /* Falling edge will set the latch. */    cbi(PORTG, PORTG2);}void MemWrite(uptr_t addr, ureg_t data){    /* Set high address byte. */    outb(PORTC, addr >> 8);    /* Set low address byte. */    outb(PORTA, (u_char)addr);    /* ALE falling */    cbi(PORTG, PORTG2);    /* Set data byte. */    outb(PORTC, data);    /* Low pulse on write. */    cbi(PORTG, PORTG0);    cbi(PORTG, PORTG0);    /* If ALE is high, then latch is transparent. */    sbi(PORTG, PORTG2);}ureg_t MemRead(uptr_t addr){    u_char rc;    /* Set high address byte. */    outb(PORTC, addr >> 8);    /* Set low address byte. */    outb(PORTC, (u_char)addr);    /* ALE falling */    cbi(PORTG, PORTG2);    /* Read signal falling. */    cbi(PORTG, PORTG1);    /* Read data byte. */    rc = inb(PORTC);    /* Read signal rising. */    sbi(PORTG, PORTG1);    /* If ALE is high, then latch is transparent. */    sbi(PORTG, PORTG2);    return rc;}/*! * \brief Detect sticky memory bus bits and shortcuts. */int XMemTestBus(void){    u_char wb;    /*     * Disable external memory bus. This will set the control bus     * signals high, clear the address latch and set all data and     * address bus lines to low.     */    XMemDisable();    /*     * First check for sticky control bus signals. We switch them     * to inputs, but they should be kept high because the pullup     * is enabled. If they become low, something is wrong.     */    cbi(DDRG, PORTG0);    if((inb(PING) & _BV(PORTG0)) != _BV(PORTG0)) {        merr = MERR_STICKY_WRITE;        return -1;    }    sbi(DDRG, PORTG0);    cbi(DDRG, PORTG1);    if((inb(PING) & _BV(PORTG0)) != _BV(PORTG0)) {        merr = MERR_STICKY_READ;        return -1;    }    sbi(DDRG, PORTG1);    cbi(DDRG, PORTG2);    if((inb(PING) & _BV(PORTG0)) != _BV(PORTG0)) {        merr = MERR_STICKY_ALE;        return -1;    }    /*     * Check the data bus for any sticky bits. Note, that ALE is     * still low, so the latch contents (all zero) will appear on     * the high byte address bus lines. We switch AD0..AD7 into     * input mode, enable the pullups and expect all line kept     * high.     */    outb(DDRA, 0);    outb(PORTA, 0xFF);    Delay(16);    if(inb(PINA) != 0xFF) {        merr_bits = ~inb(PINA);        merr = MERR_STICKY_DATABUS;        return -1;    }    /*     * Do a walking bit test to find shortcuts.     */    for(wb = 1; wb; wb <<= 1) {        outb(PORTA, ~wb);        outb(DDRA, wb);        Delay(16);        if(inb(PINA) != (u_char)~wb) {            merr = MERR_SHORT_DATABUS;            return -1;        }    };    outb(PORTA, 0);    outb(DDRA, 0xFF);#ifdef __AVR_ENHANCED__    /*     * Checking the high address bus is easy.     */    outb(DDRC, 0);    outb(PORTC, 0xFF);    Delay(16);    if(inb(PINC) != 0xFF) {        merr_bits = ~inb(PINC);        merr = MERR_STICKY_ADDRBUS;        return -1;    }    for(wb = 1; wb; wb <<= 1) {        outb(PORTC, ~wb);        outb(DDRC, wb);        Delay(16);        if(inb(PINC) != (u_char)~wb) {            merr = MERR_SHORT_ADDRBUS;            return -1;        }    };    outb(PORTC, 0);    outb(DDRC, 0xFF);#endif    return 0;}#endif/*! * \brief Test external SRAM. * * \return Number of bytes available. */size_t XMemTest(void){    volatile u_char *mem;    u_char wb;    u_char pattern[] = { 0x00, 0xFF, 0x55, 0xAA };    u_char *last = (u_char *)-1;#ifdef __AVR_ENHANCED__    /*     * Test external memory bus on ATmega128 systems.     */    if(XMemTestBus()) {        return 0;    }#endif    /*     * Enable external RAM.     */#if defined(__AVR_AT90CAN128__)    outb(XMCRA, BV(SRE));#else    outb(MCUCR, BV(SRE));#endif    /*     * Let's see, how many kBytes we have. A simple pattern test on the     * first bytes of each kilobyte boundary will do.     */    for (mem = (u_char *)(RAMEND + 1); mem <= last; mem += 1024) {        memcpy((void *)mem, pattern, sizeof(pattern));        if(memcmp((void *)mem, pattern, sizeof(pattern))) {            last = (u_char *)(mem - 1);        }        /*         * External RAM may not start at kilobyte boundary. Set the         * address to full kilobytes after first test.         */        else if(mem == (u_char *)(RAMEND + 1)) {            mem = (u_char *)((uptr_t)mem & ~0x3FF);        }    }    /*     * Set all bits in RAM.     */    for (mem = (u_char *)(RAMEND + 1); mem <= (u_char *)last; mem += 256) {        memset((void *)mem, 0xFF, 256);    }    /*     * Do an extensive test.     */    for (mem = (u_char *)(RAMEND + 1); mem <= (u_char *)last; mem++) {        /*         * The next RAM location must still have all bits set. If not,         * any manipulation on lower addresses may have modified this         * one. Probably an address bus problem.         */        if(*mem != 0xFF) {            merr_bits = ~*mem;            merr_addr = (void *)mem;            merr = MERR_BAD_ADDR;            break;        }        /*         * Do a walking bit test including all bits zero on the current         * RAM location.         */        wb = 1;        *mem = wb;        do {            if(*mem != wb) {                break;            }            wb <<= 1;            *mem = wb;        } while(wb);        /*         * If the walking bit test hasn't finished or if not all bits         * are cleared, then this data byte is broken.         */        if(wb || *mem) {            if(wb) {                merr_bits = *mem & ~wb;            }            else {                merr_bits = *mem;            }            merr_addr = (void *)mem;            merr = MERR_BAD_DATA;            break;        }    }    return (size_t)last - RAMEND;}/*! * \brief Test external banked SRAM. * * Banked memory is asumed on top of non-banked memory and the * start of banked memory is assumed on a 256 byte boundary. * * \return Number of banks available. */int XMemBankTest(size_t *xramsize){    volatile u_char *breg = (u_char *)((size_t)-1 & ~0xFF);    volatile u_char *bmem = 0;    size_t bsize = 16384;    u_char *bend = (u_char *)bmem + bsize;    u_char *xramend = (u_char *)(*xramsize + RAMEND + 1);    volatile u_char *cp;    u_char i;    u_char j;    /*     * Determine the start address of banked memory. Switch to     * bank 1 and set every 256th byte to 1. Then switch to bank 0     * and clear every 256th byte. Next switch back to bank 1     * and find the first location set to 1.     */    *(breg + 1) = 1;    for (cp = (u_char *)(RAMEND + 1); cp < xramend; cp += 256) {        *cp = 1;    }    *breg = 0;    for (cp = (u_char *)(RAMEND + 1); cp < xramend; cp += 256) {        *cp = 0;    }    *(breg + 1) = 1;    for (cp = (u_char *)(RAMEND + 1); cp < xramend; cp += 256) {        if(*cp == 1) {            bmem = cp;            break;        }    }    /*     * No RAM location kept the value of 1. There is no banked memory.     */    if(bmem == 0) {        return 0;    }    *xramsize = xramend - bmem;    for(i = 1; i; i++) {        *(breg + i) = i;        memset((void *)bmem, i, bsize);        for(cp = bmem; cp < bend; cp++) {            if(*cp != i) {                break;            }        }        if(cp < bend) {            break;        }        /*         * Test if non-banked memory is intact.         */        for (cp = (u_char *)(RAMEND + 1); cp < bmem; cp += 256) {            if(*cp) {                break;            }        }        if(cp < bmem) {            break;        }        for(j = 0; j < i; j++) {            *(breg + j) = j;            for(cp = bmem; cp < bend; cp++) {                if(*cp != j) {                    break;                }            }            if(cp < bend) {                break;            }        }        if(j < i) {            break;        }    }    return i;}/* * Read/write external SRAM until key pressed. */void LoopSRAM(void){    register u_short pattern;    volatile u_char *mem;    uptr_t faddr = 0xFFFF;    puts("Check address and data bus.");    printf_P(presskey_P);    for (;;) {        for (pattern = 1; pattern; pattern <<= 1) {            if (pattern <= RAMEND)                mem = (u_char *) (pattern | (RAMEND + 1));            else                mem = (u_char *) pattern;            *mem = (u_char) ((pattern >> 8) | pattern);        }        for (pattern = 1; pattern; pattern <<= 1) {            if (pattern <= RAMEND)                mem = (u_char *) (pattern | (RAMEND + 1));            else                mem = (u_char *) pattern;            if (*mem != (u_char) ((pattern >> 8) | pattern))                faddr = (uptr_t) mem;        }        Delay(5000);        if (GetChar()) {            printf("No RAM at 0x%04X\n", faddr);            return;        }    }}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
专区另类欧美日韩| 2021久久国产精品不只是精品| 国产婷婷色一区二区三区| 国产一区日韩二区欧美三区| 久久久久国产精品麻豆| 欧美久久一二区| 亚洲成av人片在线观看无码| 欧美日韩中文另类| 日本女人一区二区三区| 精品不卡在线视频| 成人精品在线视频观看| 亚洲婷婷综合色高清在线| 欧日韩精品视频| 日本女人一区二区三区| 国产欧美中文在线| 99精品久久99久久久久| 午夜欧美在线一二页| 精品福利在线导航| 97se亚洲国产综合自在线不卡 | 一本色道久久综合亚洲91| 一区二区高清在线| 日韩三级电影网址| 91麻豆成人久久精品二区三区| 亚洲va天堂va国产va久| 精品国产一区二区精华| 91亚洲午夜精品久久久久久| 视频在线观看一区| 欧美国产综合色视频| 在线观看国产日韩| 国产成人精品免费看| 五月天国产精品| 国产日韩欧美麻豆| 欧美老女人在线| 高清shemale亚洲人妖| 亚洲第一福利视频在线| 一区二区三区在线免费观看| 精品粉嫩aⅴ一区二区三区四区| 91丨九色丨尤物| 国内精品久久久久影院一蜜桃| 亚洲视频网在线直播| 精品国产一区二区三区av性色| 欧洲一区二区三区在线| 国产乱对白刺激视频不卡| 亚洲成av人片观看| 国产精品久久久久影院亚瑟 | www成人在线观看| 欧美影院午夜播放| 成人app网站| 国产专区综合网| 日韩专区一卡二卡| 亚洲精品免费视频| 中文字幕免费一区| 久久亚洲精品小早川怜子| 欧美日本视频在线| 色视频欧美一区二区三区| 日韩欧美一级二级三级久久久| 99久久99久久精品免费观看| 国产精品国产三级国产普通话三级| 日韩精品专区在线影院观看| 欧美日韩国产免费一区二区| 99久久免费视频.com| 丁香婷婷深情五月亚洲| 韩日欧美一区二区三区| 老司机精品视频线观看86| 五月天国产精品| 婷婷六月综合亚洲| 午夜久久久久久| 亚洲第一二三四区| 午夜精品福利一区二区三区av| 亚洲私人影院在线观看| 国产女人aaa级久久久级| 久久看人人爽人人| 久久久www成人免费无遮挡大片| 精品精品国产高清a毛片牛牛| 日韩午夜精品电影| 精品久久久久久久久久久久包黑料| 欧美美女一区二区| 欧美肥大bbwbbw高潮| 中文天堂在线一区| 国产精品欧美久久久久无广告 | 国产乱人伦偷精品视频免下载| 日本不卡1234视频| 免费高清在线视频一区·| 美洲天堂一区二卡三卡四卡视频| 天天综合网 天天综合色| 日本中文字幕一区二区视频 | 一区二区三区日韩欧美| 亚洲免费观看高清| 亚洲精品老司机| 日韩中文字幕一区二区三区| 秋霞午夜鲁丝一区二区老狼| 琪琪一区二区三区| 激情小说亚洲一区| 懂色av中文字幕一区二区三区| 成人不卡免费av| 色吧成人激情小说| 欧美一区二区日韩| 精品国产乱码久久久久久蜜臀| 久久久午夜精品| 国产精品乱码妇女bbbb| 亚洲激情自拍视频| 免费人成黄页网站在线一区二区| 麻豆91在线播放| 懂色av一区二区夜夜嗨| 欧洲精品一区二区三区在线观看| 欧美日韩成人综合| 久久久欧美精品sm网站| 亚洲精品免费在线观看| 美洲天堂一区二卡三卡四卡视频 | 亚洲人成网站在线| 日日摸夜夜添夜夜添亚洲女人| 国产美女精品一区二区三区| 99久久久久免费精品国产| 欧美日韩成人综合| 久久久精品一品道一区| 亚洲自拍偷拍图区| 国产一区二区三区四区五区美女 | 亚洲不卡av一区二区三区| 久色婷婷小香蕉久久| 成人av网站免费| 欧美区在线观看| 欧美国产丝袜视频| 日韩不卡一二三区| 色综合天天视频在线观看| 日韩精品中文字幕一区| 亚洲精品免费一二三区| 国产精品一级片| 在线电影欧美成精品| **网站欧美大片在线观看| 蜜臀av一区二区在线观看| 91美女在线视频| 国产欧美日韩麻豆91| 天天做天天摸天天爽国产一区| 99精品视频在线观看免费| 欧美一区二区视频在线观看| 亚洲视频香蕉人妖| 国产福利不卡视频| 欧美妇女性影城| 亚洲一区二区在线免费观看视频| 国产一区高清在线| 欧美一区三区二区| 亚洲激情在线激情| 成人免费高清在线| 久久精品视频免费观看| 久久精品国产澳门| 欧美日韩精品一区二区三区| 亚洲欧洲精品一区二区三区不卡| 狠狠色丁香九九婷婷综合五月| 欧美日韩国产一区二区三区地区| 国产精品成人在线观看| 国产ts人妖一区二区| 精品国产一区二区亚洲人成毛片| 奇米在线7777在线精品| 欧美伦理电影网| 亚洲少妇30p| 99久久99久久精品免费看蜜桃| 日本一区免费视频| 国产成人在线网站| 国产日韩欧美一区二区三区乱码| 国产自产v一区二区三区c| 91精品国产欧美一区二区| 日韩精品一二三四| 91精品在线一区二区| 成人在线视频一区| 欧美国产激情二区三区| 懂色中文一区二区在线播放| 欧美国产欧美综合| 国产 欧美在线| 国产欧美一区二区精品性| 国产一区二区91| 久久久美女毛片| www.亚洲人| 亚洲伦在线观看| 一本久久精品一区二区| 亚洲最快最全在线视频| 欧美日韩综合在线免费观看| 午夜私人影院久久久久| 欧美精品久久一区| 另类综合日韩欧美亚洲| 国产亚洲福利社区一区| 成人黄色一级视频| 一区二区三区日韩精品| 欧美日本免费一区二区三区| 美女在线观看视频一区二区| 26uuu亚洲综合色| 盗摄精品av一区二区三区| 国产精品久久久久久久久动漫| 日本精品裸体写真集在线观看 | 国产真实乱子伦精品视频| 欧美激情艳妇裸体舞| 色综合天天综合| 亚洲福利一区二区| 欧美xxxx老人做受| 99久久久国产精品| 视频一区国产视频| 日本一区二区三区免费乱视频| 色天使色偷偷av一区二区| 美女脱光内衣内裤视频久久影院| 欧美激情一区二区在线| 精品视频1区2区|