繁体   English   中英

U-Boot:移植代码时出现意外问题

[英]U-Boot: Unexpected problems porting code

我想通过将代码添加到{u-boot_sources}/arch/arm/cpu/armv7/omap-common/hwinit-common.c使用一些模糊提取器逻辑来扩展u-boot SPL代码。 U-boot必须在PandaBoard ES(omap4460 SoC)上使用。

因此,首先,我在x86 pc上成功实现了代码,并将其移植到基于ARM的PandaBoard上。 完整的代码可以在这里找到(作为旁注,“ main”函数是s_init()):

http://pastebin.com/iaz13Yn9

但是,我期望有数十种无法预料的效果,这些效果会导致要么在代码执行过程中停止运行,要么在读取u-boot.img后停止u-boot,或者根本不发送输出(因此不启动)。

例如,我想在for decodeErrors内调用两个函数( computeSyndromedecodeErrors ),这是另一个函数golayDecode一部分。

对于我的第一个问题,请忽略以/* >>>> These lines of code below totally break u-boot开头的多行注释下面的代码,下面的/* >>>> These lines of code below totally break u-boot 同样,只有函数computeSyndrome和调用函数golayDecode重要。

问题:如果同时注释两个函数computeSyndromedecodeErrors一切正常,并且操作系统(Android)正在启动。 但是,如果未注释出computeSyndrome并因此被处理,则在显示reading u-boot.img后,u-boot会卡住。 有趣的是:即使我用伪函数代替了computeSyndrome ,该伪函数只会迭代一个值或显示内容,u-boot也会卡住。

此外,如果我删除下面的多行注释,也包括剩余代码,则u-boot不会显示ony字符。 (1 *)

我是有关微处理器编程的初学者,但我无法弄清computeSyndrome函数的这12行或u-boot的一般行为中可能存在的错误。 (2 *)

有人知道我在想什么吗?

谢谢,P。

1 *我正在使用minicom来显示u-boot的输出,该输出是通过serial-usb-converter接收的。
2 *我正在使用以下编译器标志来确保编译时没有错误: -Wall -Wstrict-prototypes -Wdisabled-optimization -W -pedantic

void golayDecode(volatile int x[12], volatile int y[12], volatile unsigned int golayEncodedSecret[30], volatile unsigned int s, volatile unsigned char repetitionDecodedSecretBits[360]){

printf("\n[I] - Performing Golay decoding\r\n");
volatile unsigned char secret[22] = {0};
volatile unsigned char currentByte = 0, tmpByte = 0;
volatile unsigned int golayDecodedSecret[30] ={0};
volatile int twelveBitCounter = 0;//, j = 0, k = 0, q = 0, aux = 0, found = 0, bitCounter = 0, i_2 = 7, currentSecretEncByte = 0x00;
volatile int c_hat[2] = {0}, e[2] = {0};
e[0] = s;
e[1] = 0;

for(twelveBitCounter = 0; twelveBitCounter < 30; twelveBitCounter+=2){
    printf("Computing syndrome and decoding errors for bytes %03x & %03x\n", golayEncodedSecret[twelveBitCounter], golayEncodedSecret[twelveBitCounter+1]);
      computeSyndrome(golayEncodedSecret[twelveBitCounter], golayEncodedSecret[twelveBitCounter+1], x, y, s);
      decodeErrors(golayEncodedSecret[i], golayEncodedSecret[i+1], x, y, s);
}

printf("\n[D] - Reconstructing secret bytes\r\n");


/*        >>>> These lines of code below totally break u-boot
for(i = 0; i < 30; i+=2){
    currentSecretEncByte = golayDecodedSecret[i];
    volatile int j = 11;

    // Access each source bit       
    for(; 0<=j; j--){           
        volatile int currentSourceBit = (currentSecretEncByte >> j) & 0x01; 

        repetitionDecodedSecretBits[bitCounter] = currentSourceBit;
        bitCounter++;
    }
}

k = 0;
for(i = 0; i<176; i++){
    tmpByte =  repetitionDecodedSecretBits[i] << i_2;
    currentByte = currentByte | tmpByte;
    i_2--;
    if(i_2==0){ // We collected 8 bits and created a byte
        secret[k] = currentByte;
        i_2 = 7;
        tmpByte = 0x00;
        currentByte = 0x00;
        k++;
    }       
}

SHA256_CTX ctx;
unsigned char hash[32];

printf("\n[I] - Generating secret key K\n");
sha256_init(&ctx);
sha256_update(&ctx,secret,strlen((const char*)secret));
sha256_final(&ctx,hash);

printf("\n[I] - This is our secret key K\n\t==================================\n\t");
print_hash(hash);
printf("\t==================================\n");
*/
}


/* Function for syndrome computation */
void computeSyndrome(int r0, int r1, volatile int x[12], volatile int y[12], volatile unsigned int s){
unsigned int syndromeBitCounter, syndromeMatrixCounter, syndromeAux;

s = 0;
for(syndromeMatrixCounter=0; syndromeMatrixCounter<12; syndromeMatrixCounter++){
    syndromeAux = 0;

    for(syndromeBitCounter=0; syndromeBitCounter<12; syndromeBitCounter++){
        syndromeAux = syndromeAux^((x[syndromeMatrixCounter]&r0)>>syndromeBitCounter &0x01);
    }
    for(syndromeBitCounter=0; syndromeBitCounter<12; syndromeBitCounter++){
        syndromeAux = syndromeAux^((y[syndromeMatrixCounter]&r1)>>syndromeBitCounter &0x01);
    }
    s = (s<<1)^syndromeAux;

}
}



/* Funcion to recover original byte */
void decodeErrors(int r0, int r1, volatile int x[12], volatile int y[12], volatile unsigned int s){
//printf("\n[D] - Starting to decode errors for %3x | %3x\n", r0, r1);
volatile unsigned int c_hat[2] = {0xaa}, e[2] = {0xaa};
volatile unsigned int q;
unsigned int i, j, aux, found;

//printf("Step 2\n");
if(weight(s)<=3){
    e[0] = s;
    e[1] = 0;
}else{
    /******* STEP 3 */
    //printf("Step 3\n");
    i = 0;
    found = 0;
    do{
        if (weight(s^y[i]) <=2){
                e[0] = s^y[i];
                e[1] = x[i];
                found = 1;
            printf("\ntest 2\n");
        }
        i++;
        }while ((i<12) && (!found));

        if (( i==12 ) && (!found)){
         /******* STEP 4 */
        //printf("Step 4\n");
        q = 0;
        for (j=0; j<12; j++){
                aux = 0;
                for (i=0; i<12; i++)
                aux = aux ^ ( (y[j]&s)>>i & 0x01 ); 
                q = (q<<1) ^ aux;
            }

        /******* STEP 5 */
        //printf("Step 5\n");
        if (weight(q) <=3){
                e[0] = 0;
                e[1] = q;
            }else{
                /******* STEP 6 */
                //printf("Step 6\n");
                i = 0;
                found = 0;
                do{
                if (weight(q^y[i]) <=2){
                        e[0] = x[i];
                        e[1] = q^y[i];
                        found = 1;
                }
                i++;
            }while((i<12) && (!found));

                if ((i==12) && (!found)){
                /******* STEP 7 */
                printf("\n[E] - uncorrectable error pattern! (%3x | %3x)\n", r0, r1);
                /* You can raise a flag here, or output the vector as is */
                //exit(1);
            }
        }
    }
}

c_hat[0] = r0^e[0];
c_hat[1] = r1^e[1];
//printf("\t\tEstimated codeword = %x%x\n", c_hat[0], c_hat[1]);
}

实际上,代码有点太复杂,无法在启动时执行。 目前没有真正的CRT,我的堆栈也很少。
因此,我将代码移至board_init_f() ,它仍然是SPL的一部分。 它给出了更稳定的结果,并且我的算法现在可以按预期工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM