#include #include #include /* * このソフトウェアは MAX10 の UFM 内にソフトウェアが収まるかどうかを簡易的にチェックするものです。 *   Nios II Application プロジェクト内で Build 時に作成された objdump 内の記載から * 対象セクションのサイズを抜き出し足し合わせ最終的にどれくらいのサイズが必要なのかを出力します。 * 使用例) $./check_size.exe XXXX.objdump ufm_size(Hex)  */ /* * int code_searcher(FILE *fp,char* tp); * * objdump から対象セクションのサイズを検索する関数 * 引数 : File *fp fopen で開いた objdump ファイルへのファイルディスクリプタ * char *tp 検索するセクション名の先頭ポインタ * 戻り値: int        セクションサイズ */ int code_searcher(FILE *fp,char* tp){ int size = 0; //サイズ格納変数 char value [20] ={0}; //サイズ格納前の文字列格納変数 char string[100] ={0}; //コード検索用バッファ int i = 0; //ループ用変数 char search [20] ={0}; //検索文字列格納変数 //呼び出し元から検索文字をコピー i = 0; while(tp[i] != '\0'){ search[i] = tp[i]; i++; } search[i] = '\0'; // 検索するセクション名を表示 //printf(" check \"%s\" section \n",search); //objdump を 100 行分読み取り while(fgets(string, 100, fp)){ //fgets(string, 100, fp); //対象文字列を見つける if(strstr(string, search)) { //対象文字列が含まれる行を出力 //printf("%s", string); //行中の 18 バイト目にサイズ情報が記載されているのでその分インクリメント tp = string; tp = tp + 18; //サイズ情報の 8 バイト分文字列を格納し、最後に NULL 文字を格納 for(i=0;i<8;i++){ value[i] = tp[i]; } value[i] = '\0'; break; } } //サイズ情報の文字列を整数値に変換し格納。16 進数で格納されているので strtol 関数で格納 size = strtol(value,NULL,16); //検索したセクションサイズを表示 printf(" %s size : 0x%x\n",search,size); //整数型でサイズを戻す return size; } /* * main 文 */ int main(int argc, char *argv[]) { int sum_size = 0; // 合計値格納変数 int ufm_size = 0; // ユーザ指定 UFM サイズ格納変数 char check_word [20] ={0}; // objdump 内の文字を検索用変数 //説明文表示 //printf("======================================================\n\n"); //printf(" Hello. This application is to confirm whether \ //\n user software can be stored in onchip flash (UFM) or not. \n\n"); //printf("======================================================\n\n"); //引数が 3 つかどうかチェック if ((argc != 3)){ printf(" == HOW TO USE ==\n"); printf(" -- specify your objdump file and ufm size(Hex) like blow\n"); printf(" ex) $./check_size.exe test.objdump 0x8000\n"); exit(1); } // objdump ファイルをオープン、ファイルディスクリプタをセット FILE *file = fopen(argv[1], "r"); //ユーザ指定の UFM サイズ情報の文字列を整数値に変換し格納。16 進数で格納されているので strtol 関数で格納 ufm_size = strtol(argv[2],NULL,16); printf("\n ufm_size : 0x%x\n\n",ufm_size); strcpy(check_word,"entry"); sum_size += code_searcher(file,check_word); strcpy(check_word,"exceptions"); sum_size += code_searcher(file,check_word); strcpy(check_word,"text"); sum_size += code_searcher(file,check_word); strcpy(check_word,"rodata"); sum_size += code_searcher(file,check_word); strcpy(check_word,"rwdata"); sum_size += code_searcher(file,check_word); printf("\n [Result] All Section size : 0x%x\n\n",sum_size); //ファイルディスクリプタをクローズ fclose(file); //コードが収まるかチェック if( ufm_size > sum_size){ printf("OOOOOOOOOOOOOOOOOOOOOO\n\n"); printf(" OK ,Can be stored!\n"); printf(" - You can use more %d byte \n\n", ufm_size - sum_size); printf("OOOOOOOOOOOOOOOOOOOOOO\n"); } else{ printf("xxxxxxxxxxxxxxxxxxxxxx\n\n"); printf(" No , Not be in stored! \n"); printf(" - Reduce code at least %d byte\n\n", sum_size - ufm_size); printf("xxxxxxxxxxxxxxxxxxxxxx\n"); } return EXIT_SUCCESS; }