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 নয়, এটি আপনার পক্ষেও কার্যকর হতে পারে, আমার মনে হয় আমি এটি কোনও রূপ বা ফ্যাশনে বাধা প্রদান করেছি।