STM32F2: Makefile, লিঙ্কার স্ক্রিপ্ট এবং বাণিজ্যিক IDE ছাড়াই ফাইল সংমিশ্রণ


16

আমি প্রায় দুই মাস ধরে একটি STM32F2 (বিশেষত, একটি উন্নয়ন বোর্ডে STM32F217IGH6) এর সাথে কাজ করছি। এখন পর্যন্ত আমার বৃহত্তম সমস্যাটি "সেটআপ" এর সাথে করতে হয়েছিল, যার মধ্যে মেকফিল, লিংক স্ক্রিপ্ট এবং স্টার্ট-আপ ফাইল অন্তর্ভুক্ত রয়েছে।

বিশেষত, আমি আমার বাধা ভেক্টর টেবিলটি সঠিকভাবে সেট করতে সক্ষম হয়েছি এবং বাধা হ্যান্ডলারদের কল করেছি। এসটি বাণিজ্যিক আইডিই অনুসারে উদাহরণ সরবরাহ করে। পরিবর্তে, আমি জিসিসি সরঞ্জামচেইনের ফ্রি ইয়াগার্তো পুনঃসংকলনটি ব্যবহার করছি (এবং জেটিএইচের মাধ্যমে চিত্রটি লোড করতে ওপেনওসিডি)।

আমার বোর্ডের (বা এর নিকটতম চাচাত ভাই) এর জন্য কি প্রকল্প রয়েছে যাতে অবরুদ্ধ হ্যান্ডলারদের ডেকে আনার জন্য অ বাণিজ্যিক-বাণিজ্যিক আইডিইগুলির জন্য উপযুক্ত মেকফিল, লিংকার স্ক্রিপ্ট এবং প্রারম্ভ-আপ ফাইল সংমিশ্রণ রয়েছে?


2
আপনার কর্টেক্স এম 3 উদাহরণগুলির সন্ধান করা উচিত, সঠিক বোর্ড এবং প্রসেসর আপনার জিজ্ঞাসাগুলির জন্য গুরুত্বপূর্ণ নয়। আপনার সম্ভবত লিঙ্কার স্ক্রিপ্টে মেমরি লেআউট এবং মেকফাইলে ফ্ল্যাশ করার পদ্ধতিটি পরিবর্তন করতে হবে তবে এটি অবশ্যই হওয়া উচিত।
স্টার ব্লু

1
আপনি কি এই সমস্ত কিছু গিট রেপোতে রেখে গিথুব বা অন্য কিছুতে রাখতে পারেন?
ক্রুদ্ধ 13

1
ঠিক এই কারণেই আমি চেষ্টা করার সাথে সাথে এসটিএম ব্যবহার বন্ধ করে দিয়েছি। যদি তারা খারাপ জীবনযাপনের সরঞ্জামগুলি আমার জীবনকে কঠিন করে তুলছে তবে আমি অন্য কোথাও যাচ্ছি। আমি যখন PSoC3 এবং PSoC5 এর জন্য আইডিই চেষ্টা করেছি তখন এটির পার্থক্যের একটি বিশ্ব ছিল।
রকেটম্যাগনেট

আপনি কি ইয়াগার্তোর প্রতি প্রতিশ্রুতিবদ্ধ? এটি সম্পূর্ণ জরিমানা এবং একটি দুর্দান্ত প্রশ্ন তোলে, তবে আমি কোডসোসারি লাইট সরঞ্জামচেনের সাথে পরিচিত । কোনও আলাদা সরঞ্জামচেনের উত্তর সম্ভবত অভিযোজিত হতে পারে তবে বাক্সের বাইরে কাজ করবে না।
কেভিন ভার্মির

উত্তর:


20

http://github.com/dwelch67

বিশেষত stm32f4 এবং stm32vld, তবে অন্যগুলি আপনার পক্ষেও কার্যকর হতে পারে। এমবেড এবং এমজেও ডিরেক্টরিটি এমবেডের অধীনে (কর্টেক্স-এম0)।

আমি এটিকে সহজ বোকা পন্থা, ন্যূনতম লিঙ্কার স্ক্রিপ্ট, ন্যূনতম প্রারম্ভিক কোড ইত্যাদি রাখা পছন্দ করি The কাজটি কোনও নির্দিষ্ট সরঞ্জামচেন দ্বারা নয় কোড দ্বারা সম্পন্ন হয়।

গ্রন্থাগার কলগুলির জন্য একটি সংস্থান হিসাবে সংকলন করতে সংকলকটি ব্যবহার না করে বেশিরভাগ সিসিসি এবং বিন্টিল (থাম্ব সক্ষম) এই উদাহরণগুলির সাথে কিছুটা কাজ করবে, আমি স্টক লিঙ্কার স্ক্রিপ্টগুলি ব্যবহার করি না etc. নতুন থাম্ব 2 অংশ তাই কিছু পরিবর্তন প্রয়োজন হতে পারে।

আমি নিজের জিসিসি, বাইনুটিলস এবং এলএলভিএম / ক্ল্যাংয়ের পাশাপাশি কোডসোস্রি ব্যবহার করি উদাহরণস্বরূপ (এখন মেন্টর গ্রাফিক্স তবে আপনি নিখরচায় / লাইট সংস্করণ পেতে পারেন)।

এসপ যখন নতুন টার্গেটের জন্য কোনও প্রকল্প একসাথে রেখে শুরু করবেন তখন আপনাকে কিছুটা বিচ্ছিন্ন করতে হবে। বিশেষত আইটেমগুলি যেখানে আপনি চান তা নিশ্চিত করার জন্য, উদাহরণস্বরূপ ভেক্টর টেবিল।

উদাহরণস্বরূপ stm32f4d / blinker02 দেখুন। এটি ভেক্টরগুলির সাথে শুরু হয় the

/* vectors.s */
.cpu cortex-m3
.thumb

.word   0x20002000  /* stack top address */
.word   _start      /* 1 Reset */
.word   hang        /* 2 NMI */
.word   hang        /* 3 HardFault */
.word   hang        /* 4 MemManage */
.word   hang        /* 5 BusFault */
.word   hang        /* 6 UsageFault */
.word   hang        /* 7 RESERVED */
.word   hang        /* 8 RESERVED */
.word   hang        /* 9 RESERVED*/
.word   hang        /* 10 RESERVED */
.word   hang        /* 11 SVCall */
.word   hang        /* 12 Debug Monitor */
.word   hang        /* 13 RESERVED */
.word   hang        /* 14 PendSV */
.word   hang        /* 15 SysTick */
.word   hang        /* 16 External Interrupt(0) */
.word   hang        /* 17 External Interrupt(1) */
.word   hang        /* 18 External Interrupt(2) */
.word   hang        /* 19 ...   */

.thumb_func
.global _start
_start:
    /*ldr r0,stacktop */
    /*mov sp,r0*/
    bl notmain
    b hang

.thumb_func
hang:   b .

/*.align
stacktop: .word 0x20001000*/

;@-----------------------
.thumb_func
.globl PUT16
PUT16:
    strh r1,[r0]
    bx lr
;@-----------------------
.thumb_func
.globl PUT32
PUT32:
    str r1,[r0]
    bx lr
;@-----------------------
.thumb_func
.globl GET32
GET32:
    ldr r0,[r0]
    bx lr
;@-----------------------
.thumb_func
.globl GET16
GET16:
    ldrh r0,[r0]
    bx lr

.end

এই উদাহরণে কোনও বাধা নেই, তবে আপনার প্রয়োজনীয় অন্যান্য জিনিসগুলি এখানে রয়েছে।

blinker02.c- তে সি কোডের মূল বডি থাকে যা আমি সিএন এন্টিয়েন্টপয়েন্ট সহ কল ​​করি যা আমি নোটমেন () কল করি না এড়ানোর জন্য (কিছু সংকলক আপনার বাইনারিতে জাঙ্ক যোগ করে যখন আপনার একটি প্রধান () থাকে)।

আপনি একটি কাটা এবং পেস্ট বাঁচাতে হবে। মেকফাইলটি সংকলন এবং লিঙ্কিংয়ের গল্পটি বলে। নোট করুন যে আমার কয়েকটি উদাহরণ একই কোড থেকে দুটি বা আরও বেশি বাইনারি সংকলন করে। gcc সংকলক, llvm এর ঝনঝনু সংকলক, কেবল থাম্ব এবং থাম্ব 2, বিভিন্ন অপ্টিমাইজেশন ইত্যাদি

উত্স ফাইলগুলি থেকে অবজেক্ট ফাইল তৈরি করে শুরু করুন।

vectors.o : vectors.s
    $(ARMGNU)-as vectors.s -o vectors.o

blinker02.gcc.thumb.o : blinker02.c
    $(ARMGNU)-gcc $(COPS) -mthumb -c blinker02.c -o blinker02.gcc.thumb.o

blinker02.gcc.thumb2.o : blinker02.c
    $(ARMGNU)-gcc $(COPS) -mthumb -mcpu=cortex-m3 -march=armv7-m -c blinker02.c -o blinker02.gcc.thumb2.o

blinker02.gcc.thumb.bin : memmap vectors.o blinker02.gcc.thumb.o
    $(ARMGNU)-ld -o blinker02.gcc.thumb.elf -T memmap vectors.o blinker02.gcc.thumb.o
    $(ARMGNU)-objdump -D blinker02.gcc.thumb.elf > blinker02.gcc.thumb.list
    $(ARMGNU)-objcopy blinker02.gcc.thumb.elf blinker02.gcc.thumb.bin -O binary

blinker02.gcc.thumb2.bin : memmap vectors.o blinker02.gcc.thumb2.o
    $(ARMGNU)-ld -o blinker02.gcc.thumb2.elf -T memmap vectors.o blinker02.gcc.thumb2.o
    $(ARMGNU)-objdump -D blinker02.gcc.thumb2.elf > blinker02.gcc.thumb2.list
    $(ARMGNU)-objcopy blinker02.gcc.thumb2.elf blinker02.gcc.thumb2.bin -O binary

লিঙ্কার, এলডি, একটি লিঙ্কার স্ক্রিপ্ট ব্যবহার করে যা আমি মেমম্যাপ বলি, এটি অত্যন্ত বেদনাদায়ক হতে পারে, কখনও কখনও কোনও কারণে, কখনও কখনও না। আমি কমকে পছন্দ করি এক আকারের সমস্ত পদ্ধতির চেয়ে বেশি, রান্নাঘরের সিঙ্ক পদ্ধতির ব্যপারে সমস্ত কিছু।

আমি সাধারণত ডেটা ব্যবহার করি না (প্রায় ভালই না) এবং এই উদাহরণটির জন্য .bss এর দরকার নেই তাই এখানে লিঙ্কার স্ক্রিপ্ট রয়েছে, প্রোগ্রামটি (। টেক্সট) রাখার জন্য যথেষ্ট যেখানে এই প্রসেসরের জন্য এটি হওয়া দরকার যেখানে তারা আমি থাকি am এটি ব্যবহার করছি.

MEMORY
{
    ram : ORIGIN = 0x08000000, LENGTH = 0x1000
}

SECTIONS
{
    .text : { *(.text*) } > ram
}

এটির সংজ্ঞা দেওয়ার জন্য আমার একটি স্মৃতি অঞ্চল রয়েছে, নাম র‌্যাম সম্পর্কে বিশেষ কিছু নেই যা আপনি এটিকে ফু বা বার বা বব বলতে পারেন বা টেড এটি গুরুত্বপূর্ণ নয় কেবল এটি মেমরি আইটেমগুলিকে বিভাগগুলিতে লিঙ্ক করে। বিভাগগুলি টেক্সট, .ডাটা, .বিএস, .ডোটাটা এবং স্মৃতি মানচিত্রে যেখানে যায় সেগুলির মতো জিনিসগুলি সংজ্ঞায়িত করে।

আপনি যখন এটি নির্মাণ করেন, আপনি দেখতে পান যে আমি এটিকে সবকিছু পৃথক করে ফেলছি (objজডাম্প-ডি)

Disassembly of section .text:

08000000 <_start-0x50>:
 8000000:       20002000        andcs   r2, r0, r0
 8000004:       08000051        stmdaeq r0, {r0, r4, r6}
 8000008:       08000057        stmdaeq r0, {r0, r1, r2, r4, r6}
 800000c:       08000057        stmdaeq r0, {r0, r1, r2, r4, r6}
 8000010:       08000057        stmdaeq r0, {r0, r1, r2, r4, r6}

মূল বিষয়টি হ'ল বাম দিকের ঠিকানাটি যেখানে আমরা এটি চেয়েছিলাম, ভেক্টর.এস কোড বাইনারিতে প্রথম (কারণ এটি এলডি কমান্ড লাইনে প্রথম, যদি না আপনি লিঙ্কার স্ক্রিপ্টে কিছু না করেন তবে আইটেমগুলি প্রদর্শিত হবে বাইনারিটি ক্রমে তারা ld কমান্ড লাইনে থাকে)। সঠিকভাবে বুট করার জন্য আপনাকে অবশ্যই আপনার ভেক্টর টেবিলটি সঠিক জায়গায় রয়েছে ure প্রথম আইটেমটি আমার স্ট্যাকের ঠিকানা, এটি ঠিক আছে। দ্বিতীয় আইটেমটি _ স্টার্টের ঠিকানা এবং এটি একটি বিজোড় সংখ্যা হওয়া উচিত। কোনও লেবেলের আগে .thumb_func ব্যবহারের ফলে এটি ঘটে থাকে যাতে আপনার অন্য কুরুচিপূর্ণ জিনিসগুলি করতে হবে না।

08000050 <_start>:
 8000050:       f000 f822       bl      8000098 <notmain>
 8000054:       e7ff            b.n     8000056 <hang>

08000056 <hang>:
 8000056:       e7fe          

সুতরাং 0x08000051 এবং 0x08000057 _ স্টার্ট এবং হ্যাংয়ের জন্য সঠিক ভেক্টর এন্ট্রি। কল কল নোমেন ()

08000098 <notmain>:
 8000098:       b510            push    {

এটি দেখতে দুর্দান্ত দেখাচ্ছে (তারা বিশৃঙ্খলার ক্ষেত্রে বিজোড় সংখ্যাযুক্ত ঠিকানা দেখায় না)।

সবকিছু ঠিক আছে.

ব্লিঙ্কার05 উদাহরণ এ যান, এটি একটি বাধা সমর্থন করে। এবং কিছু র্যাম প্রয়োজন, সুতরাং .bss সংজ্ঞায়িত করা হয়।

MEMORY
{
    rom : ORIGIN = 0x08000000, LENGTH = 0x100000
    ram : ORIGIN = 0x20000000, LENGTH = 0x1C000
}

SECTIONS
{
    .text : { *(.text*) } > rom
    .bss  : { *(.bss*) } > ram
}

মনে রাখবেন রাম এবং রোম নির্বিচারে নাম, বব এবং টেড, ফু এবং বার সমস্ত কাজ ঠিকঠাক।

পুরো ভেক্টরগুলি দেখাতে যাচ্ছি না কারণ কর্টেক্স-এম 3 ভেক্টর টেবিলের একটি জিলিয়ন এন্ট্রি রয়েছে যদি আপনি একটি সম্পূর্ণ তৈরি করেন (কোর থেকে কোরে পরিবর্তিত হতে পারে এবং চিপ বিক্রেতার দ্বারা নির্বাচিত বিকল্পগুলির উপর নির্ভর করে একই কোরের মধ্যে সম্ভবত) প্রাসঙ্গিক অংশগুলি এখানে বিচ্ছিন্নতার পরে রয়েছে:

08000000 <_start-0x148>:
 8000000:       20020000        andcs   r0, r2, r0
 8000004:       08000149        stmdaeq r0, {r0, r3, r6, r8}
 8000008:       0800014f        stmdaeq r0, {r0, r1, r2, r3, r6, r8}
...
8000104:       0800014f        stmdaeq r0, {r0, r1, r2, r3, r6, r8}
 8000108:       08000179        stmdaeq r0, {r0, r3, r4, r5, r6, r8}
 800010c:       0800014f        stmdaeq r0, {r0, r1, r2, r3, r6, r8}

সেই হ্যান্ডলারটি ঠিক সঠিক স্থানে স্থাপন করতে কিছু ট্রায়াল এবং ত্রুটি নেয়, আপনার চিপটি এটির মতো ঠিক একই জায়গায় হওয়া উচিত নয় যেখানে এটি হওয়া দরকার এবং এটির সাথে অনেকগুলি বাধা দিয়ে আপনি যেভাবে অন্য কোনও বিঘ্নের জন্য সন্ধান করছেন check কর্টেক্স-এম প্রসেসরগুলি সাধারণ বাহুগুলির মতো নয়, এটি তৈরি করুন যাতে আপনি বাধা দেওয়ার জন্য ট্রামপোলিন কোড প্রয়োজন না, তারা একটি নির্দিষ্ট সংখ্যক রেজিস্ট্রার সংরক্ষণ করে এবং লিঙ্ক রেজিস্টার সামগ্রীগুলির মাধ্যমে প্রসেসরের মোডগুলির স্যুইচিং পরিচালনা করে। কম্পাইলারের জন্য হার্ডওয়্যার এবং অ্যাবিআই যতক্ষণ না যথেষ্ট পরিমাণে কাজ করে এটি সমস্ত কাজ করে। এক্ষেত্রে আমি সি তে হ্যান্ডলারটি করেছি, অন্য প্ল্যাটফর্মগুলির বিপরীতে এবং অতীতে আপনার কম্পাইলার / সিনট্যাক্সের সাথে বিশেষ কিছু করার দরকার নেই কেবল একটি ফাংশন তৈরি করুন (তবে ফাংশন / হ্যান্ডলারের মূup় জিনিসগুলি করবেন না)

//-------------------------------------------------------------------
volatile unsigned int intcounter;
//-------------------------------------------------------------------
// CAREFUL, THIS IS AN INTERRUPT HANDLER
void tim5_handler ( void )
{
    intcounter++;
    PUT32(TIM5BASE+0x10,0x00000000);
}
// CAREFUL, THIS IS AN INTERRUPT HANDLER
//-------------------------------------------------------------------

ব্লিঙ্কার05 এর মেকফাইলটি ব্লিঙ্কার02 সদৃশ হওয়া উচিত, বেশিরভাগটির জন্য কাটা এবং পেস্ট করুন। স্বতন্ত্র উত্স ফাইলগুলিকে বস্তুতে পরিণত করুন তারপরে লিঙ্ক করুন। আমি জিসিসি এবং ক্ল্যাং ব্যবহার করে থাম্ব, থাম্ব 2 তৈরি করি। আপনি সমস্ত পরিবর্তন করতে পারেন: লাইনটি কেবলমাত্র জিসিসি আইটেমগুলিকে অন্তর্ভুক্ত করতে কেবল আপনার যদি ঝাঁকুনি (এলএলভিএম) জড়িত না চান। আমি ক্লঞ্জ আউটপুট বিটিডব্লুকে একত্রিত করতে এবং লিঙ্ক করতে বাইনুটিস ব্যবহার করি।

এই সমস্ত প্রকল্পগুলি নিখরচায়, শেল্ফের বাইরে, ওপেন সোর্স, সরঞ্জামগুলি ব্যবহার করে। কোনও আইডিই নয়, কেবল কমান্ড লাইন। হ্যাঁ আমি কেবল লিনাক্সের সাথে না এবং উইন্ডোজ নয়, তবে এই সরঞ্জামগুলি উইন্ডো ব্যবহারকারীদের জন্যও উপলব্ধ, rm -f এর মতো জিনিসগুলিকে মেকফাইলে কিছু বদলাতে, উইন্ডোতে বিল্ডিং করার সময় এই জাতীয় জিনিসগুলি। এটি বা ভিএমওয়্যার বা ভার্চুয়ালবক্স বা কিউমুতে লিনাক্স চালান। আইডিই ব্যবহার না করা মানে আপনি আপনার পাঠ্য সম্পাদকটিও বেছে নেবেন, আমি এতে প্রবেশ করতে চাই না, আমার কাছে আমার প্রিয় (গুলি) রয়েছে। নোট করুন যে gnu মেক প্রোগ্রামের একটি অত্যন্ত বিরক্তিকর বৈশিষ্ট্যটি হ'ল এটি মেকফিলের আসল ট্যাবগুলির প্রয়োজন, আমি আবেগের সাথে অদৃশ্য ট্যাবগুলিকে ঘৃণা করি। সুতরাং মেকফাইলগুলির জন্য একটি পাঠ্য সম্পাদক যা ট্যাবগুলি ছেড়ে যায়, অন্যটি উত্স তৈরির উত্স কোডের জন্য। আমি উইন্ডোজ সম্পর্কে জানি না,

আমি আশা করি এটি সাহায্য করে, এটি সঠিক চিপ / বোর্ড নয় তবে একটি কর্টেক্স-এম 4 ওয়েল এম 4 এম 4 নয়, এই আলোচনার জন্য যথেষ্ট কাছে। প্রকৃত কর্টেক্স-এম 3 এর জন্য এমবেড বা stm32vld দির দেখুন (মেকফায়ালস এবং বুট কোড ইত্যাদির জন্য এম 4 থেকে পর্যাপ্ত পার্থক্য নয়), তবে এসটি দ্বারা তৈরি করা হয়নি। কর্টেক্স-এম 3 কোর এর বিক্রেতাদের জুড়ে একই হওয়া উচিত, কর্টেক্স-এম 3 এবং কর্টেক্স-এম 4 উভয়ই এআরএমভি 7 মি এবং পৃথক হওয়ার চেয়ে কাছাকাছি রয়েছে। কর্টেক্স-এম 0 একটি এআরএমভি 6 মি, বিরক্ত করার জন্য খুব কমই থাম্ব 2 নির্দেশ রয়েছে, সংকলকরা এটি ধরেন নি তাই কেবল থাম্ব ব্যবহার করুন (প্রয়োজন হলে আপনি একটি এআরএমভি 4 টি (কেবল থাম্ব) তৈরি করছেন)। আমার থিমুলেটর সিমুলেটরটি কেবল থাম্ব, কোনও থাম্ব 2 নয়, এটি আপনার পক্ষেও কার্যকর হতে পারে, আমার মনে হয় আমি এটি কোনও রূপ বা ফ্যাশনে বাধা প্রদান করেছি।


আমি উত্তরটি পড়ছিলাম এবং আমি অনুমান করি যে এই উত্তরের লেখক আপনি হবেন। আপনার উত্তরগুলি আমাকে অনেক সহায়তা করেছে এবং আমাকে এভিআর এবং পিআইসি ফ্যানবয় হওয়ার চেয়ে এআরএম প্রসেসরগুলিতে যেতে অনুপ্রাণিত করেছে। ধন্যবাদ
MaNyYaaCk

আপনাকে স্বাগতম ... এগিয়ে দিয়ে দিন ...
old_timer

2

আপনি এই সাইটটিতে একবার নজর রাখতে পারেন যেখানে এটি লিঙ্কারের মূল বিষয়গুলি এবং কোডটিতে লো-লেভেল_ইনিট ব্যাখ্যা করার চেষ্টা করে।

দয়া করে নোট করুন যে পৃষ্ঠাটি সমস্যার বর্ণনা দেওয়ার জন্য ফোকাস করেছে, সুতরাং এনভিচ ভেক্টর একধরনের ন্যূনতম।

তারপরে "STM32F2xx স্ট্যান্ডার্ড পেরিফেরালস লাইব্রেরি" তে আপনার আরও একটি সম্পূর্ণ উদাহরণ রয়েছে, কেবলমাত্র জিসিসি বিভাগগুলিতে দেখুন (যেহেতু ইয়াগার্তো জিসিসি ভিত্তিক)। এবং সেখানে একটি উদাহরণ কোড রয়েছে যা আপনাকে এনভিকের একটি সঠিক সেটআপ (বিঘ্নিত ভেক্টর টেবিল) সাথে সহায়তা করবে।

সুতরাং এটি সম্পূর্ণ উত্তর না হলেও আমি আশা করি এটি যে কোনও উপায়ে সহায়ক।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.