ዝርዝር ሁኔታ:

ክፍል 1 ARM Assembly TI RSLK ሮቦቶች የመማር ሥርዓተ ትምህርት ላብ 7 STM32 Nucleo: 16 ደረጃዎች
ክፍል 1 ARM Assembly TI RSLK ሮቦቶች የመማር ሥርዓተ ትምህርት ላብ 7 STM32 Nucleo: 16 ደረጃዎች

ቪዲዮ: ክፍል 1 ARM Assembly TI RSLK ሮቦቶች የመማር ሥርዓተ ትምህርት ላብ 7 STM32 Nucleo: 16 ደረጃዎች

ቪዲዮ: ክፍል 1 ARM Assembly TI RSLK ሮቦቶች የመማር ሥርዓተ ትምህርት ላብ 7 STM32 Nucleo: 16 ደረጃዎች
ቪዲዮ: Come Ye Children | Charles H. Spurgeon | Christian Audiobook 2024, ህዳር
Anonim
Image
Image

የዚህ Instructable ትኩረት STM32 Nucleo ማይክሮ መቆጣጠሪያ ነው። ይህ ተነሳሽነት ከባዶ አጥንቶች የመሰብሰቢያ ፕሮጀክት መፍጠር መቻል ነው። ይህ በጥልቀት እንድንመረምር እና የብዙ አስተማሪዎች ርዕሰ ጉዳይ የሆነውን የ MSP432 Launchpad ፕሮጀክት (TI-RSLK) እንድንረዳ ይረዳናል።

የኮድ አቀናባሪ ስቱዲዮን በመጠቀም ለ MSP432 የመሰብሰቢያ-ብቻ ፕሮጀክት ለመፍጠር በመስመር ላይ በጣም ብዙ እገዛ የለም። እስከ አሁን እኛ ከቅድመ-ነባር የስብሰባ ፕሮጀክት እየገለበጥን/እየለጠፍን ነበር። ይህ አካሄድ በደንብ አገልግለናል።

ሆኖም ፣ አሁን ፣ ለ ላብ 7 ፣ ትንሽ ችግር አጋጥሞናል። ወይም ቢያንስ ጊዜያዊ እክል። ላቦራቶሪ 7 ውስን-ግዛት-ማሽኖችን ያስተዋውቃል ፣ እና መጀመሪያ ያገኘነው የእሴት ድርድርን የመፍጠር እና የመጠቀም አስፈላጊነት ነው። የ TI ትምህርቱ በዋናነት ሲ ፕሮግራምን ስለሚጠቀም - ይህ ችግር አይደለም። ነገር ግን እነዚህ መምህራን ያተኮሩት በስብሰባ ላይ እንጂ ሐ ላይ አይደለም።

በተጨማሪም ፣ ድርድሩ ተነባቢ-ብቻ እሴቶች ስለሆኑ ፣ ራም ሳይሆን ፍላሽ ማህደረ ትውስታ ውስጥ ማስገባት ጥሩ ይሆናል።

STM32 MCU ን በመጠቀም ለስብሰባ ፕሮጄክቶች በመስመር ላይ ብዙ ተጨማሪ እርዳታ ያለ ይመስላል ፣ ስለሆነም እኛ በ MSP432 እና በኮድ አቀናባሪ ስቱዲዮ ላይ ለመተግበር የተማረውን ለመጠቀም ዓላማ በማድረግ በዚህ አስተማሪ እንጀምራለን።

ወደዚያ ግብ በሚወስደው መንገድ ላይ ፣ እኛ ከሌላ ፣ ታዋቂ ማይክሮ መቆጣጠሪያ ጋር ተሞክሮም እናገኛለን።

ደረጃ 1 የመሣሪያ የመጀመሪያ ሙከራ

የመሣሪያ የመጀመሪያ ሙከራ
የመሣሪያ የመጀመሪያ ሙከራ
የመሣሪያ የመጀመሪያ ሙከራ
የመሣሪያ የመጀመሪያ ሙከራ
የመሣሪያ የመጀመሪያ ሙከራ
የመሣሪያ የመጀመሪያ ሙከራ

እንደገና ፣ በተለይ STM32 Nucleo ን ለምን ይመርጣሉ?

በሐቀኝነት? ለኤአርኤም ተቆጣጣሪዎች በባዶ-ብረት ስብሰባ ፕሮጄክቶች ላይ ጥሩ መጣጥፎችን እፈልግ ነበር ፣ እና ይህንን ተከታታይ መጣሁ። እና ደግሞ STM32 ታዋቂ MCU መስሎ ስለሚታይ።

እኔ አንዳንድ ምርምር አደረግሁ (ለመምረጥ ብዙ ስሪቶች አሉ - ከላይ ያለውን ምስል ይመልከቱ) ፣ ግን እኔ በአማዞን (በአሜሪካ ውስጥ) ስለምጠቀም በመጨረሻ ምን ማግኘት እችላለሁ።

ከአንዳንድ የመነሻ መመሪያዎች ጋር በቀላል ግን በሙያዊ ጥቅል ውስጥ ይመጣል። ማሳያው በመቆጣጠሪያው ውስጥ የተቃጠለው በትክክል እኛ ቀደም ባሉት የመማሪያ ዕቃዎች ውስጥ ያደረግነው መሆኑን ማየት ትንሽ አስቂኝ ነበር - በአንድ አዝራር ፕሬስ መሠረት ኤልኢዲ ብልጭ ድርግም ይላል።

ይህ የልማት ሰሌዳ 2 ኤልኢዲዎች እና አንድ ተጠቃሚ-ግፊት አዝራር በመኖራቸው ከ MSP432 ጋር በጣም ተመሳሳይ ይመስላል። MSP432 2 የተጠቃሚ-አዝራሮች አሉት።

በፎቶዎቹ ውስጥ እንደሚመለከቱት ፣ ቦርዱ ሚኒ እና ማይክሮ ዩኤስቢ እንደሌለው ትንሽ ተገርሜ ነበር። ገመድ ለመግዛት መሮጥ ነበረበት።

ሌላ ጥሩ ሙከራ ከኮምፒዩተርዎ ጋር ሲያገናኙት (እኔ የሊኑክስ ሳጥን እጠቀማለሁ) ፣ “NODE_F303RE” ተብሎ በሚጠራው የፋይል አቀናባሪ ውስጥ ይታያል። ሁለት ፋይሎችን ፣ አንድ ኤችቲኤምኤል እና አንድ ጽሑፍን የሚገልጥ መክፈት።

ያ ብቻ ነው ፣ ግን ቢያንስ እሱ ግንኙነት በጣም ቀላል ይመስላል ይላል።

አሁን ለመጀመር ዝግጁ ነን።

ከ IVONOMICON Bare Metal ጽሑፍ ተከታታይ ውስጥ ማንኛውንም ጥሩ መረጃ ላለመድገም እሞክራለሁ ፣ ግን ይልቁን ይጨምሩ።

ደረጃ 2 - አስፈላጊዎቹ

የሚያስፈልገን የመጀመሪያው ነገር አጠናቃሪ ነው።

እና ከዚያ ፣ አራሚ ያስፈልገናል-

devchu@chubox ~ ተጭኗል ፣ ለማስወገድ 0 እና 8 አልተሻሻለም። 2 ፣ 722 ኪባ ማህደሮችን ማግኘት ያስፈልጋል። ከዚህ ቀዶ ጥገና በኋላ 7 ፣ 738 ኪባ ተጨማሪ የዲስክ ቦታ ጥቅም ላይ ይውላል። ያግኙ: 1 https://us.archive.ubuntu.com/ubuntu xenial/universe amd64 gdb-arm-none-eabi amd64 7.10-1ubuntu3+9 [2, 722 ኪባ] በ 1 ሴ (1 ፣ 988) 2 ፣ 722 ኪባ ተገኘ። kB/s) ቀደም ሲል ያልተመረጠ ጥቅል gdb-arm-none-eabi ን መምረጥ። (የውሂብ ጎታ ንባብ… 262428 ፋይሎች እና ማውጫዎች አሁን ተጭነዋል።) ለማራገፍ በመዘጋጀት ላይ…/gdb-arm-none-eabi_7.10-1ubuntu3+9_amd64.deb… gdb-arm-none-eabi (7.10-1ubuntu3+9)… ለሰው-ዲቢ ቀስቅሴዎች (2.7.5-1)… gdb-arm-none-eabi (7.10-1ubuntu3+9) በማዋቀር ላይ…

ደረጃ 3 - አስፈላጊዎቹ - ዊንዶውስ

ከላይ ያለው ደረጃ ሊኑክስን እየተጠቀምን እንደሆነ ተገምቷል። ዊንዶውስ የምንጠቀም ከሆነስ?

ወደ ክንድ ገንቢ ጣቢያ መሄድ ይችላሉ ፣ እና ብዙ የማውረድ አማራጮች አሉ። እኔ የዊንዶውስ 8 ማሽን እጠቀማለሁ።

በመጫን ጊዜ እኔ እኔ cygwin ን ስለምጠቀም ብቻ ከፕሮግራም ፋይሎች ይልቅ ወደ “C: \” ድራይቭ ለመጫን መርጫለሁ ፣ እና ከአካባቢያዬ ማጠራቀሚያ ወደ ሥር C: አቃፊ ከሁሉም በላይ አገናኝ መፍጠር ቀላል ነበር። በፕሮግራም ፋይሎች (ከቦታዎች ጋር ፣ ወዘተ) በሚወስደው መንገድ ላይ ብጥብጥ።

ስለዚህ ፣ የእኔ ሳይግዊን አከባቢ እና መንገድ ፣ ወዘተ ፣ እንደዚህ ይመስላል

C: / cygwin64 / home / bin / arm-none-eabi-gcc ፣ ክንድ- none-eabi-gcc ወደ C: / GNUToolsArmEmbedded / 7.2018.q2. ወቅታዊ / bin / arm-none-eabi- ግ.ሲ.

ከዚያ በሳይግዊን ቤት ስር የ “dev” አቃፊ ፈጠርኩ ፣ እና እዚያም ዋናውን ፋይል አስቀመጥኩ እና የአጠናቃሪውን ትእዛዝ አሄድኩ። (ለኮምፕሌተር ነገሮች ከዚህ በታች ይመልከቱ)።

ለ gdb (ክንድ- none-eabi-gdb) ትክክለኛውን ተመሳሳይ ነገር አደረግሁ።

ደረጃ 4 አስፈላጊዎቹ ምንድን ናቸው

ስለዚህ “gcc-arm-none-eabi” ምንድነው?

የ gnu ኮምፕሌተር (ጂሲሲ) ለሚሠራው ማሽን የፕሮግራም ቋንቋዎችን (እንደ ሲ) ወደ ቤተኛ ኮድ ያጠናቅራል። ለምሳሌ ፣ በዊንዶውስ ማሽንዎ ላይ ጂ.ሲ.ሲን በመጠቀም አንዳንድ ሲ ኮድን ቢሰበስቡ በዊንዶውስ ማሽን ላይ እንዲሠራ ይገነባል። የመነጨው አስፈፃሚ (በተለምዶ) በ ARM ማይክሮ መቆጣጠሪያ ላይ አይሰራም።

ስለዚህ ፣ ወደ አርኤም ማይክሮ-ተቆጣጣሪ የሚወርዱ እና የሚቃጠሉ ፕሮግራሞችን ለመገንባት (አሁን ባለው ሁኔታችን STM32 Nucelo ይሆናል) ፣ ለጂሲሲ ሌላ ነገር መስጠት አለብን-“የመሰብሰብ” ችሎታ። ያም ማለት አስፈፃሚውን የማመንጨት ችሎታ ፣ ለአገሬው ስርዓት (እና ለአቀነባባሪው) ሳይሆን ለታለመው ስርዓት (አርኤም ማይክሮ መቆጣጠሪያ)። ያ ነው “gcc-arm-none-eabi” የሚጫወተው።

ስለዚህ “gdb-arm-none-eabi” ምንድነው?

አዲስ የተፈጠረውን አስፈፃሚ ወደ ማይክሮ-ተቆጣጣሪው ካወረድን እና ካቃጠልን (ብልጭ ብለን) ፣ ምናልባት ማረም እንፈልግ ይሆናል-በኮዱ መስመር በመስመር። ጂዲቢ gnu አራሚ ነው ፣ እና እሱ እንዲሁ ፣ ሥራውን የሚያከናውንበት መንገድ ይፈልጋል ፣ ግን በተለየ ስርዓት ላይ ያነጣጠረ።

ስለዚህ ፣ gdb-arm-none-eabi ለ GDB ፣ gcc-arm-none-eabi ለ GCC ነው።

ሌላው የተጠቆመው የጥቅል ጭነት “libnewlib-arm-none-eabi” ነበር። ያ ምንድን ነው?

ኒውሊብ በተካተቱ ስርዓቶች ላይ ለመጠቀም የታሰበ የ C ቤተ -መጽሐፍት እና የሂሳብ ቤተ -መጽሐፍት ነው። በተካተቱ ምርቶች ላይ በቀላሉ ጥቅም ላይ እንዲውሉ በሚያደርጋቸው የብዙ ቤተ -መጽሐፍት ክፍሎች ጥምረት ነው።

እና በመጨረሻም ፣ ጥቅሉ “libstdc ++-arm-none-eabi”። ያኛው በጣም ግልፅ ነው ፤ ለመስቀለኛ አቀናባሪው የ C ++ ቤተ-መጽሐፍት ነው ፣ ለተከተተ የ ARM ጥቃቅን ተቆጣጣሪዎች።

ደረጃ 5 - የአገናኝ ፋይል

አገናኝ ፋይል
አገናኝ ፋይል
አገናኝ ፋይል
አገናኝ ፋይል

የአገናኝ ስክሪፕት እንፍጠር።

በዚህ ፋይል ውስጥ አንድ ቁልፍ ክፍል ወይም እገዳ የማስታወሻ ትእዛዝ ይሆናል።

--- ከ sourceware.org

የአገናኝ ባለሙያው ነባሪ ውቅር የሁሉንም ማህደረ ትውስታ መመደብን ይፈቅዳል። የማስታወሻ ትዕዛዙን በመጠቀም ይህንን መሻር ይችላሉ። የማስታወሻ ትዕዛዙ በዒላማው ውስጥ የማስታወሻ ብሎኮችን ቦታ እና መጠን ይገልጻል። የትኛውን የማስታወሻ ክልሎች በአገናኝ አቅራቢው ሊጠቀሙባቸው እንደሚችሉ እና የትኞቹን የማስታወሻ ክልሎች ማስወገድ እንዳለበት ለመግለጽ ሊጠቀሙበት ይችላሉ። ከዚያ ለተወሰኑ የማህደረ ትውስታ ክልሎች ክፍሎችን መመደብ ይችላሉ።አገናኝ ባለሙያው በማስታወሻ ክልሎች ላይ በመመስረት የክፍል አድራሻዎችን ያዘጋጃል ፣ እና በጣም ስለሚሞሉ ክልሎች ያስጠነቅቃል። አገናኛው ከሚገኙት ክልሎች ጋር ለመገጣጠም ክፍሎችን አይቀይርም። የአገናኝ ስክሪፕት የማስታወሻ ትዕዛዙን ብዙ አጠቃቀሞችን ሊይዝ ይችላል ፣ ሆኖም ፣ ሁሉም የተተረጎሙ የማስታወሻ ብሎኮች በአንድ የማስታወሻ ትእዛዝ ውስጥ እንደተገለጹ ተደርገው ይወሰዳሉ።:

ትዝታ

{name [(attr)]: ORIGIN = አመጣጥ ፣ LENGTH = len…}

በአንቀጹ ውስጥ ያለው ምሳሌ-

/* የ RAM መጨረሻ እና የቁልል ማህደረ ትውስታ ገደብ* //* (4KB SRAM በ STM32F031x6 መስመር ፣ 4096 = 0x1000)*//* (ራም በአድራሻ 0x20000000 ይጀምራል) _estack = 0x20001000;

ትዝታ

{ፍላሽ (rx) ፦ ORIGIN = 0x08000000 ፣ LENGTH = 32K ራም (rxw) ፦ ORIGIN = 0x20000000 ፣ LENGTH = 4K}

ስለዚህ ለተለየ ሰሌዳችን ምን ያህል FLASH (ለፕሮግራማችን እና ለቋሚዎቻችን ፣ ወዘተ) እና ምን ያህል ራም (በፕሮግራሙ ለመጠቀም ፤ ክምር እና ቁልል ፣ ወዘተ) ማወቅ አለብን። ይህ ትንሽ አስደሳች ይሆናል።

ከኒውክሊዮ ጋር የሚመጣው ጥሩ ትንሽ ካርድ ፍላሽ ማህደረ ትውስታ አለው ይላል 512 ኪባይት ፣ እና SRAM 80 ኪባይት ነው። ሆኖም ፣ ከዩኤስቢ ጋር በማገናኘት ፣ በሁለት ፋይሎች እንደ ፋይል ስርዓት ይጫናል ፣ እና ሁለቱም የፋይል አቀናባሪው እና ጂፒፓድ ከ 540+ ኪባይት በላይ ቦታ እንዳለው ያመለክታሉ። (ራንደም አክሰስ ሜሞሪ?).

ግን ፣ የፋይል አቀናባሪውን በመጠቀም ሁለቱን ፋይሎች ለመሰረዝ መሞከር ፣ ግንኙነቱን ማቋረጥ እና ከዚያ መሣሪያውን እንደገና ማገናኘት ፣ አሁንም ሁለቱን ፋይሎች ያሳያል። (እና የፋይል አቀናባሪው አንድ ነገር ያውቀዋል ምክንያቱም በእያንዳንዱ ፋይል ላይ ትንሽ “መቆለፊያ” አዶ አለ።

ስለዚህ በካርዱ ላይ ካሉ አሃዞች ጋር እንሂድ። ስለዚህ አሁን ከላይ ያለውን ምሳሌ ወስደን ወደ እኛ ልዩ ሰሌዳ እንለውጠዋለን።

ከአጠቃላይ ኬቢ ወደ የተወሰነ የባይት ብዛት ለመሄድ እንደዚህ ያለ የመስመር ላይ ማህደረ ትውስታ መቀየሪያ የሆነ ነገር ለመጠቀም ይፈልጉ ይሆናል።

ከዚያ የመስመር ላይ አስርዮሽ ወደ ሄክስ መቀየሪያ ለመጠቀም ይፈልጉ ይሆናል።

/ * የ RAM መጨረሻ እና የቁልል ማህደረ ትውስታ ወሰን ይግለጹ */

/* (4KB SRAM በ STM32F031x6 መስመር ፣ 4096 = 0x1000)* //* ምሳሌ*/

/ * ደረጃ 1: (80KB SRAM በ STM32F303RE ፣ 81920 = 0x14000) * // * የእኛ ሰሌዳ */

/* ደረጃ 2 ፣ የሄክሱን መጠን ወደ ሄክስ መነሻ አድራሻ (ከዚህ በታች) ያክሉ። */

/ * (ራም በአድራሻ 0x20000000 ይጀምራል) */

_estack = 0x20001000; / * ምሳሌ */

_estack = 0x20014000; / * የእኛ ሰሌዳ */

ትዝታ {

ፍላሽ (rx): ORIGIN = 0x08000000 ፣ LENGTH = 512K

ራም (rxw): ORIGIN = 0x20000000 ፣ LENGTH = 80K

}

ከላይ ያለውን ፋይል “linker.script.ld” ብለን እንጠራው።

ደረጃ 6 የቬክተር ጠረጴዛ

የቬክተር ሰንጠረዥ
የቬክተር ሰንጠረዥ

አሁን በጣም መሠረታዊ የሆነ የመስተጓጎል አያያዝን ለማድረግ (ከስብሰባዎች ጋር) ትንሽ የመሰብሰቢያ ፋይል እንፈጥራለን። እኛ የጽሑፉን ምሳሌ እንከተላለን እና “ኮር ኤስ” የተባለ ፋይል እንፈጥራለን።

እንደገና ፣ የምሳሌ ፋይል ይዘቶች እዚህ አሉ ፣ ግን ለተለየ ሰሌዳችን ለውጥ አደረግሁ-

// እነዚህ መመሪያዎች የእኛን ቺፕ ባህሪዎች እና

// የምንጠቀመው የመሰብሰቢያ ቋንቋ ፦ ይልቁንስ የእኛን ቦርድ ኮርቴክስ። በዚህ ደረጃ ላይ ከላይ ያለውን ምስል ይመልከቱ / /.. እሱ FPU */.thumb // ዓለም አቀፍ የማስታወሻ ሥፍራዎች አሉት።.ዓለም አቀፍ vtable.global reset_handler / * * ትክክለኛው የቬክተር ሰንጠረዥ. * ቀለል ለማድረግ የ RAM መጠን እና የ ‹ዳግም ማስጀመር› ተቆጣጣሪ * ብቻ ተካትተዋል። */.type vtable ፣ %ዕቃ vtable: ቃል _estack.word reset_handler.seze vtable ፣. -ttable

እምም.. አይ '.መመደብ' መመሪያ

ሆኖም ፣ ያ ወሳኝ አይደለም። ስለዚያ (ምናልባት) በኋላ።

.አገባብ የተዋሃደ

.አገባብ [የተዋሃደ | ተከፋፈለ]

ይህ መመሪያ በ ARM- መመሪያ-አዘጋጅ ክፍል ውስጥ በተገለጸው መሠረት የመማሪያ ስብስብ አገባቡን ያዘጋጃል

9.4.2.1 የመማሪያ ቅንብር አገባብ ሁለት በትንሹ የተለያየ አገባብ ለ ARM እና THUMB መመሪያዎች ድጋፍ ነው። ነባሪው ፣ ተከፋፍሎ ፣ የ ARM እና THUMB መመሪያዎች የራሳቸው ፣ የተለዩ አገባቦች የነበሯቸውን የድሮ ዘይቤን ይጠቀማል። በአዲሱ የአገባብ መመሪያ በኩል ሊመረጥ የሚችል አዲሱ ፣ የተዋሃደ አገባብ።

.fpu vfpv4

የ GCC ኮምፕሌተር ተንሳፋፊ ነጥቦችን በተመለከተ በርካታ አማራጮችን ሁለትዮሽዎችን ማምረት ይችላል - ለስላሳ - ምንም FPU በሌለበት በሲፒዩ ላይ ለማሄድ ተስማሚ - ስሌቶች በሶፍትዌር ውስጥ በአቅራቢ በተሰራ softfp - በሲፒዩ ላይ ወይም ከ FPU ጋር ለማሄድ ተስማሚ - ካሉ FPU ይጠቀማል።. ለተለየ ጉዳያችን (የራስዎን ምርምር ማድረግ ይኖርብዎታል) ፣ ይህ ልዩ ቦርድ FPU ከ vfpv4 ጋር ይጣጣማል። ከዚህ ጋር መጫወት ሊኖርብዎት ይችላል። ወይም በ softfp ላይ እንኳን ይተዉት።

.አውራ ጣት (vs.arm)

እነዚህ የ ARM ማይክሮ መቆጣጠሪያ በእውነቱ የመማሪያ ስብስቦች ድብልቅ አላቸው። አንደኛው ARM ነው ፣ ሌላው ደግሞ ታምብ ነው። አንድ ልዩነት የ 16 ቢት መመሪያዎች ከ 32 ቢት መመሪያዎች ጋር ነው። ስለዚህ ፣ ይህ መመሪያ ቀጣዮቹን መመሪያዎች እንደ ታምብ ወይም አርኤም እንዲይዝ ለኮምፕሌተርው ይነግረዋል።

እነዚህ አስተማሪዎች ገና በተቋረጠ የሚገጣጠሙ የመሰብሰቢያ መርሃ ግብሮች ውስጥ ስላልገቡ ቀሪውን ፋይል ልክ እንወስዳለን።

ደረጃ 7 የ ‹ሰላም ዓለም› ፕሮግራም የስብሰባ ሥሪት

የሚከተለው ቀደም ሲል ወደተፈጠረው “ኮር ኤስ” ፋይል ውስጥ ሊገባ ይችላል። ይህ እንደገና በአንቀጹ ውስጥ ካለው ምሳሌ ነው።

/ * * ዳግም አስጀምር ተቆጣጣሪ። ዳግም ማስጀመር ላይ ተጠርቷል። */.type reset_handler ፣ %function reset_handler: // የቁልል ጠቋሚውን ወደ ቁልል መጨረሻ ያዘጋጁ። // ‹_estack› እሴት በእኛ አገናኝ ስክሪፕት ውስጥ ተገል isል። LDR r0, = _estack MOV sp, r0

// አንዳንድ ዱሚ እሴቶችን ያዘጋጁ። እነዚህን እሴቶች ስናይ

// በእኛ አራሚ ውስጥ የእኛ ፕሮግራም // በቺፕ ላይ ተጭኖ እየሠራ መሆኑን እናውቃለን። LDR r7, = 0xDEADBEEF MOVS r0, #0 main_loop: // 'r0' ን ለመመዝገብ 1 ያክሉ። ADDS r0 ፣ r0 ፣ #1 // ወደ ኋላ ተመለስ። ቢ main_loop.size_handler ፣.- reset_handler ን

ስለዚህ ፣ ከላይ የተጠቀሰው መርሃ ግብር ግፊት ሊታወቅ የሚችል ንድፍ ወደ አንድ ዋና የ MCU መዝገብ (በዚህ ሁኔታ R7) ውስጥ መጫን እና ከዜሮ ጀምሮ ወደ ሌላ ዋና የ MCU መዝገብ (በዚህ ሁኔታ R0) ከዜሮ ጀምሮ የሚጨምር እሴት መጫን ነው። እኛ የማስፈጸሚያ ኮዱን ብናልፍ ፣ የ R0 የውሂብ ጭማሪን ማየት አለብን።

MSP432 ን እና TI-RSLK ኮርስ/ቤተ-ሙከራዎችን በተመለከተ ከአስተማሪዎቹ ጋር እየተከተሉ ከሆነ ፣ ከዚያ ሁሉም ከላይ የተጠቀሰው ፕሮግራም ለእርስዎ በጣም የታወቀ መሆን አለበት።

እኔ የማየው አንድ አዲስ ነገር R7 ን ለማስመዝገብ “DEADBEEF” ን ሲጭኑ “=” መጠቀም ነው። ያንን አልተጠቀምንም ነበር።

እዚህ የተያያዘው “ኮር ኤስ” ፋይል አሁን ሙሉውን ምንጭ ይ containsል።

ደረጃ 8 - ኮዱን ማጠናቀር

አንዳንድ የትእዛዝ መስመር ነገሮችን ለማድረግ ጊዜው አሁን ነው። አንድ እውነተኛ ነገር ፣ በመጨረሻ።

ሆኖም ፣ እኛ እዚያ አይደለንም። በአንቀጹ ውስጥ የተሰጠውን ትእዛዝ እንደገና ማረም እና ወደ እኛ ሁኔታ መለወጥ አለብን።

የምሳሌ ኮድ እዚህ አለ

arm -none -eabi -gcc -x assembler -with -cpp -c -O0 -mcpu = cortex -m0 -mthumb -Wall core. S -o core.o

ለ GCC ወደ gnu.org ጣቢያ ከሄድን ፣ (በዚህ ጉዳይ ስሪት 7.3) ፣

x

-X ቋንቋውን መግለፅ ነው። ያለበለዚያ -x ፣ ከዚያ አጠናቃሪው የፋይል ቅጥያውን በመጠቀም ለመገመት ይሞክራል። (በእኛ ሁኔታ *. S)።

ከጽሑፉ ላይ ያለው ከላይ የተጠቀሰው ምሳሌ ተሰብሳቢ-ከ-ሲፒፒን ይገልጻል ፣ ግን እኛ ብቻ ሰብሳቢ ማድረግ እንችላለን።

-C “ይሰብስቡ ግን አያገናኙ” ይላል።

ኦ 0

የ -O የማሻሻያ ደረጃን ማዘጋጀት ነው። -O0 (ኦ -ዜሮ) ን መጠቀም "የማጠናከሪያ ጊዜን ይቀንሱ እና ማረም የተጠበቀው ውጤት ያስገኛል። ይህ ነባሪ ነው" ይላል።

mcpu = cortex-m0

-Mcpu የዒላማውን ፕሮሰሰር ስም ይገልጻል። በእኛ ሁኔታ ኮርቴክስ-ኤም 4 ይሆናል።

እምቢ

-Mthumb አርኤም እና ታምብ ግዛቶችን በሚፈጽም ኮድ መካከል መምረጥን ይገልጻል።

ግድግዳ

-ግድግዳው በእርግጥ በጣም የተለመደ እና የታወቀ ነው። ሁሉንም የማስጠንቀቂያ ባንዲራዎች ያበራል።

በመጨረሻ ፣ በትእዛዙ መጨረሻ ላይ የግብዓት ፋይል ኮር ኤስ እና የውጤት ፋይል core.o.

ከተለየ ጉዳያችን ጋር የሚስማማው አዲሱ የትእዛዝ መስመር እዚህ አለ።

arm -none -eabi -gcc -x assembler -c -O0 -mcpu = cortex -m4 -mumbumb -Wall core. S -o core.o

እና ያ ተሰብስቧል።

ደረጃ 9 ፕሮግራሙን ማገናኘት

በጽሁፉ ውስጥ ካለው ምሳሌ በቀጥታ ይህንን እናገኛለን-

arm -none -eabi -gcc core.o -mcpu = cortex -m0 -mthumb -Wall --specs = nosys.specs -nostdlib -lgcc -T./STM32F031K6T6.ld -o main.elf

አብዛኛው ከላይ ያየሃቸው። ከዚህ በታች ምን አዲስ ነገር አለ።

specs = nosys.specs

ይህ ለማብራራት ትንሽ አስቸጋሪ ነው።

እሱ ከ “ሴሚስተስተንግስ” እና “ዳግም ማነጣጠር” ጋር የሚገናኝ ሲሆን ከግብዓት / ውፅዓት ጋር የተያያዘ ነው። እንዲሁም ከስርዓት ጥሪዎች እና ቤተመፃህፍት ጋር የተያያዘ ነው።

በተለምዶ ፣ የተከተቱ ስርዓቶች መደበኛ የግቤት/የውጤት መሣሪያዎችን አይሰጡም። ይህ በስርዓት ወይም በቤተመጽሐፍት ጥሪዎች ላይ ተጽዕኖ ይኖረዋል (ምሳሌ ፦ printf ())።

Semihosting ማለት አራሚ (በቀይ ከተከበበ አራሚ ክፍል 11 ደረጃን ይመልከቱ) ልዩ ሰርጥ አለው እና ከፊል አስተናጋጅ ፕሮቶኮልን ይጠቀማል ፣ እና በአስተናጋጁ ማሽን ላይ (በአራሚው በኩል) የ printf () ን ውጤት ማየት ይችላሉ።

በሌላ በኩል እንደገና ማወዳደር ማለት እነዚያ በጣም ተመሳሳይ ስርዓት ወይም የቤተመጽሐፍት ጥሪዎች ሌላ ትርጉም አላቸው ማለት ነው። እነሱ ሌላ ነገር ያደርጋሉ ፣ ያ ለተከተተው ስርዓት ትርጉም ይሰጣል። በአንድ መንገድ ፣ ለታተመ () ፣ አዲስ አተገባበር ፣ የዚያ ተግባር እንደገና መተግበር አለ።

ያንን ሁሉ ከተናገርን ፣ --specs = nosys.specs እኛ ከፊል አስተናጋጅ አንሆንም ማለት ነው። ያ ማለት በተለምዶ እኛ እንደገና እንመለሳለን ማለት ነው። ያ ወደ ቀጣዩ ባንዲራ ያመጣናል።

nostdlib

የአገናኝ አማራጭ -nostdlib ራሱን ችሎ ለማሄድ የታሰበውን ፕሮግራም ለማገናኘት ያገለግላል። -nostdlib የግለሰቦችን አማራጮች -ነባሪ ነባሪዎች እና -የመገለጫዎችን ያመለክታል። ከዚህ በታች ሁለቱን አማራጮች በተናጠል እንወያይበታለን ፣ ግን በጣም የተለመደው አጠቃቀም ለአንድ-ማቆሚያ ግብይት nostdlib ብቻ ነው። የተስተናገደውን ፕሮግራም ሲያገናኙ ፣ እንደ libc ያሉ መደበኛ የሥርዓት ቤተ-ፍርግሞች በነባሪነት ይገናኛሉ ፣ ፕሮግራሙ ለሁሉም መደበኛ ተግባራት (ሕትመት ፣ strlen እና ጓደኞች)። የአገናኝ አማራጭ -ነባሪ ነባሪዎች ከነዚያ ነባሪ ቤተ -መጽሐፍት ጋር መገናኘትን ያሰናክላል ፤ የተገናኙት ቤተመፃህፍት በትክክል -l ባንዲራውን በመጠቀም በቀጥታ ወደ አገናኙ ያሰሟቸው በትክክል ናቸው።

lgcc

libgcc.a የተወሰኑ ማሽኖች ጉድለቶችን ለማሸነፍ የውስጥ ንዑስ ፕሮግራሞችን የሚሰጥ መደበኛ ቤተ -መጽሐፍት ነው። ለምሳሌ ፣ የ ARM አንጎለ ኮምፒውተር የመከፋፈል መመሪያን አያካትትም። የ libgcc.a የ ARM ስሪት የመከፋፈል ተግባርን ያካተተ ሲሆን አሰባሳቢው አስፈላጊ ሆኖ ሲገኝ ወደዚያ ተግባር ጥሪዎችን ይልካል።

ይህ አገናኝ ይህንን ፋይል እንደ አገናኝ ስክሪፕት እንዲጠቀም የሚነግርበት መንገድ ብቻ ነው። በእኛ ሁኔታ ፣ የፋይሉ ስም linker.script.ld ነው።

ዋና። ራስ

በመጨረሻ ፣ ወደ መሣሪያችን የሚቃጠል/የሚበራ የመጨረሻው የውጤት ምስል ፋይል ስም ምን እንደሚሆን ለአገናኝተኛው እንነግራለን።

ለተለየ ሁኔታችን የተሻሻለው የተሟላ የትእዛዝ መስመር ሥሪት እዚህ አለ-

arm -none -eabi -gcc core.o -mcpu = cortex -m4 -mthumb -Wall --specs = nosys.specs -nostdlib -lgcc -T./linker.script.ld -o main.elf

እኛ የስክሪፕት ፋይል ፣ እና የ core.o ፋይል ፣ ሁለቱም ከላይ ባለው የትእዛዝ መስመር የምንሠራበት በአንድ ማውጫ ውስጥ መሆናቸውን እናረጋግጣለን።

እና ያለምንም ችግሮች ያገናኛል።

ቼክ

ከዚያ እንሮጣለን-

arm-none-eabi-nm main.elf

እና እኛ እናገኛለን:

devchu@chubox: ~/Development/Atollic/TrueSTUDIO/STM32_workspace_9.1 $ arm-none-eabi-nm main.elf 20014000 A _estack 08000010 t main_loop 08000008 T reset_handler 08000000 T vtable

ጥሩ ይመስላል. የእጅ-አንዳ-ኢቢ-nm ትእዛዝ በነገር ፋይሎች ውስጥ ምልክቶችን የመዘርዘር መንገድ ነው።

ደረጃ 10: የሙከራ ግንኙነት ከ STM32 Nucleo-64 ጋር

ሙከራ ከ STM32 Nucleo-64 ጋር ግንኙነት
ሙከራ ከ STM32 Nucleo-64 ጋር ግንኙነት
ሙከራ ከ STM32 Nucleo-64 ጋር ግንኙነት
ሙከራ ከ STM32 Nucleo-64 ጋር ግንኙነት

እሱን ለመቀበል ከመረጡ የመጀመሪያው ተልእኮዎ ስርዓትዎን የልማት ቦርድዎን እንዲያይ ማድረግ ነው።

ዊንዶውስ መጠቀም

ለዊንዶውስ ፣ TrueSTUDIO ን ከአቶሊክ (ነፃ ስሪት) ለመጫን ወሰንኩ። እሱ ህመም የሌለው ጭነት ነበር እና ግንኙነቱን ለመፈተሽ st-link ን መጠቀም እችል ዘንድ ሾፌሩን በራስ-ሰር ጭኗል። አንዴ TrueSTUDIO ን ከጫንኩ እና የመሣሪያው ሥራ አስኪያጅ መሣሪያውን ካየነው ፣ እኛ እየተከተልነው በነበረው የባሬ ብረት ጽሑፍ የተጠቆሙትን የቴክሳን/የአገናኝ መሣሪያዎችን አውርጃለሁ። እንደገና አቃፊውን በቀጥታ በ “C: \” ስር አስቀምጫለሁ ፣ እና እንደገና ከአከባቢዬ የሳይግዊን ቤን ቢን እስከ ትዕዛዞቹ ድረስ አንዳንድ አገናኞችን ፈጠርኩ።

ln -s /c/STM32. MCU/stlink-1.3.0-win64/bin/st-info.exe ~/bin/st-info

በእርግጥ ከመሣሪያው ጋር መገናኘት መቻላችንን ለማየት እንደ መጀመሪያ ሙከራ ፣ ሮጫለሁ

st-info-ምርመራ

እና ተመለስኩ: -

1 ብልጭ ድርግም ያሉ ፕሮግራም አውጪዎች ተገኝተዋል

ስለዚህ አሁን የእኛን የልማት ቦርድ ማውራት/መጠየቅ እንደምንችል እናውቃለን።

ሊኑክስን መጠቀም

ለሊኑክስ በእርግጥ ሾፌር አያስፈልግዎትም። ግን ለዲቢያን ፣ የቅዱስ መሳሪያዎችን ከምንጩ መገንባት ይኖርብዎታል።

git clone

Libusb-1.0-0-dev መጫኑን ያረጋግጡ።

ተስማሚ ዝርዝር | grep -E "*libusb.*dev*"

እርስዎ ማየት አለብዎት:

libusb-1.0-0-dev/xenial ፣ አሁን 2: 1.0.20-1 amd64 [ተጭኗል]

ወይም እንደዚህ ያለ ነገር።

እሱን ለመጫን ፦

sudo apt-get install libusb-1.0-0-dev

ከላይ የተጠቀሰው ተመሳሳይ እንዳልሆነ ልብ ይበሉ

sudo apt-get install libusb-dev

ትክክለኛው የጎደለው libusb dev cmake ችግሮች እንዲኖሩት ሊያደርግ ይችላል።

የ CMake ስህተት - በዚህ ፕሮጀክት ውስጥ የሚከተሉት ተለዋዋጮች ጥቅም ላይ ውለዋል ፣ ግን ወደ NOTFOUND ተዋቅረዋል። እባክዎን ያዋቅሯቸው ወይም በ CMake ፋይሎች ውስጥ በትክክል መዘጋጀታቸውን እና ያረጋግጡ - LIBUSB_INCLUDE_DIR (ADVANCED)

ወደ የፕሮጀክቱ ሥር ማውጫ (… blah /blah /stlink) ይለውጡ። “መልቀቅ” ያድርጉ።

ከዚያ ግንባታዎች በኋላ መሣሪያዎቹ በ “.. /build /Release” ስር መሆን አለባቸው።

ከዚያ “st-info --probe” ን ማካሄድ ይችላሉ። ከኒውክሊዮ ጋር የተገናኘው ውጤት እዚህ አለ ፣ ከዚያ አይደለም።

devchu@chubox: ~/ልማት/stlink $ x39 / x35 / x35 / x36 / x35 / x37 ብልጭታ: 524288 (ገጾች መጠን: 2048) sram: 65536 chipid: 0x0446 descr: F303 ከፍተኛ ጥግግት መሣሪያ devchu@chubox: ~/Development/stlink $./build/Release/st- መረጃ -ምርመራ 0 የ stlink programmers devchu@chubox: ~/Development/stlink $

ደረጃ 11 GDB ን ከሊኑክስ ጋር እንጠቀም

GDB ን ከሊኑክስ ጋር እንጠቀም
GDB ን ከሊኑክስ ጋር እንጠቀም
GDB ን ከሊኑክስ ጋር እንጠቀም
GDB ን ከሊኑክስ ጋር እንጠቀም

ይህንን ሁሉ ከሞከሩ ፣ እና ይህን ያህል ከደረሱ - በጣም ጥሩ! እጅግ በጣም ጥሩ። አሁን ትንሽ እንዝናና።

እነዚህ የ ARM ልማት ቦርዶች ሲገዙ ፣ ከቴክሳስ መሣሪያዎች MSP432 Launchpad ይሁኑ ፣ ወይም አሁን እየተወያየንበት ያለነው ፣ ኑክሊዮ-ኤፍ 303 (STM32 Nucleo-64) ፣ እነሱ ብዙውን ጊዜ ቀድሞውኑ በሮጫ ፕሮግራም ብልጭ ድርግም ይላሉ። የ LED (ዎች) ብልጭታ (ፍጥነት) ለመለወጥ ማብሪያ / ማጥፊያን መጫንንም የሚያካትት አንዳንድ ብልጭ ድርግም የሚል ፕሮግራም።

ያንን ከመጠን በላይ ለመፃፍ ከመቸኮላችን በፊት ለማየት እና ለማድረግ ምን እንዳለ እንይ።

በሊኑክስ ፣ ተርሚናል ይክፈቱ ፣ እኛ የሠራነውን የ stlink git ፕሮጀክት ማውጫ ይለውጡ እና የ st-util መሣሪያን ያግኙ።

devchu@chubox: ~/Development/stlink $ find. -ስም st-util

./ ግንባታ/መልቀቅ/src/gdbserver/st-util

ያንን መሣሪያ ያሂዱ። ከዚህ ቀደም ከ st-info -probe ጋር ያለንን ግንኙነት አስቀድመን ስለሞከርነው እንደዚህ ያለ ውፅዓት ማግኘት አለብን-

devchu@chubox: ~/Development/stlink $./build/Release/src/gdbserver/st-util

st-util 1.4.0-50-g7fafee2 2018-10-20T18: 33: 23 INFO common.c: የመሣሪያ መለኪያዎችን በመጫን ላይ…. 2018-10-20T18: 33: 23 መረጃ የጋራ: 0x80000 ባይት (512 ኪባ) በ 2048 ባይቶች ገጾች 2018-10-20T18: 33: 23 INFO gdb-server.c: ቺፕ መታወቂያ 00000446 ፣ ኮር መታወቂያ 2ba01477 ነው። 2018-10-20T18: 33: 23 INFO gdb-server.c: ማዳመጥ በ *: 4242…

ያ አሁን የጂዲቢ አገልጋዩ እየሄደ ነው ፣ እና የእኛን የልማት ሰሌዳ ያያል ፣ እና ከሁሉም በላይ ፣ ወደብ 4242 (ነባሪው ወደብ) ላይ እያዳመጠ ነው።

አሁን የ GDB ደንበኛውን ለማቃጠል ዝግጁ ነን።

በሊኑክስ ውስጥ ሌላ ተርሚናል ይክፈቱ ፣ ይህንን ያስገቡ

arm-none-eabi-gdb -tui

ያ gdb ን በጥብቅ የትእዛዝ መስመርን ከማሄድ ጋር ተመሳሳይ ነው ፣ ግን እሱ በምትኩ ጽሑፍ ላይ የተመሠረተ ተርሚናል ያወጣል (የእኔ ግምት እርግማኖችን ይጠቀማል)።

የ GDB ደንበኛ እና የ GDB አገልጋዩ እየሄደ ነው። ሆኖም ደንበኛው ከአገልጋዩ ጋር አልተገናኘም። በአሁኑ ጊዜ ስለ እኛ ኑክሊዮ (ወይም የመረጡት ቦርድ) ምንም አያውቅም። ልንነግረው ይገባል። በተርሚናል ውስጥ የእርስዎ ጥያቄ አሁን “(gdb)” መሆን አለበት። ግባ

እገዛ ዒላማ

ዝርዝር ይሰጥዎታል። እኛ የምንፈልገው የተራዘመ -ርቀት ዒላማ መሆኑን ልብ ይበሉ - በርቀት ኮምፒተርን በተከታታይ መስመር ይጠቀሙ።

ግን እኛ ደግሞ ቦታውን መስጠት አለብን። ስለዚህ ፣ በ (gdb) ጥያቄ ፣ ያስገቡ

(gdb) ዒላማ የተራዘመ-ሩቅ localhost: 4242

እንደዚህ ያለ ነገር መልሱን መመለስ አለብዎት-

(gdb) ዒላማ የተራዘመ-ሩቅ localhost: 4242

Localhost ን በመጠቀም የርቀት ማረም: 4242 0x080028e4 በ ?? ()

ይህ በእንዲህ እንዳለ ፣ st-util gdbserver ን በሚሠራው ተርሚናል ላይ ይህንን አግኝተናል-

2018-10-20T18: 42: 30 INFO gdb-server.c: 6 hw የእረፍት ነጥብ መመዝገቢያዎች ተገኝተዋል

2018-10-20T18: 42: 30 INFO gdb-server.c: GDB ተገናኝቷል።

ደረጃ 12: እንደግመው ፣ በዊንዶውስ እና ፕሮግራማችንን ያብሩ

እንደግመው ፣ በዊንዶውስ እና ፕሮግራማችንን ያብሩ
እንደግመው ፣ በዊንዶውስ እና ፕሮግራማችንን ያብሩ
እንደግመው ፣ በዊንዶውስ እና ፕሮግራማችንን ያብሩ
እንደግመው ፣ በዊንዶውስ እና ፕሮግራማችንን ያብሩ
እንደግመው ፣ በዊንዶውስ እና ፕሮግራማችንን ያብሩ
እንደግመው ፣ በዊንዶውስ እና ፕሮግራማችንን ያብሩ

የ st-util gdbserver ን ፣ እና የእጅ-አንዳ-ኢቢ-ጂዲቢ ደንበኛውን ለማስኬድ ደረጃዎች በቀድሞው ደረጃ እንዳደረግነው በመሠረቱ ተመሳሳይ ናቸው። ሁለት ተርሚናሎች (ሳይግዊን ፣ DOS cmd ፣ ወይም Windows Powershell) ይከፍታሉ ፣ የቅዱስ መገልገያውን ቦታ ያግኙ ፣ ያሂዱ። በሌላ ተርሚናል ውስጥ ክንድ-ማንም-ኢቢ-ጂዲቢ ደንበኛን ያሂዱ። ብቸኛው ልዩነት -ቱቱ (ተርሚናል ላይ የተመሠረተ የጽሑፍ እይታ) ሁናቴ አይደገፍም።

ከላይ በዊንዶውስ ውስጥ ከሠራ ፣ ምናልባት ማቆም አለብዎት (ደንበኛው ብቻ)። በዚህ ጊዜ ፣ የግንባታ ፋይልዎ (“core.out”) ባለበት ቦታ የ GDB ደንበኛውን ማሄድ ወይም ለጂዲቢ ደንበኛው እንደ ክርክር ሆኖ ወደዚያ ፋይል መላውን መንገድ ማከል ያስፈልግዎታል።

እኔ cygwin ን በመጠቀም እና አገናኞች ከአካባቢያችን $ HOME // ቢን ማውጫ ወደ ሁለቱም መሣሪያዎች ወደሚኖሩበት ቦታ ቀለል አድርጌአለሁ።

እሺ ፣ ልክ እንደበፊቱ ተሰብስበን እና አገናኝተናል ፣ እና እኛ ለመብረቅ ዝግጁ የሆነ ፋይል main.elf አለን።

በአንድ መስኮት ውስጥ እየሮጠ ያለው st-util አለን። የ GDB ደንበኛውን እንደገና እንጀምራለን ፣ በዚህ ጊዜ እኛ እናደርጋለን-

arm-none-eabi-gdb main.elf

እንዲጀመር እንፈቅዳለን ፣ (gdb) ጥያቄውን ይጠብቁ ፣ ተመሳሳይ የግንኙነት ትዕዛዛችንን ለጂዲቢ አገልጋይ (st-util) እናደርጋለን ፣ እና አስፈፃሚውን ለማብራት ዝግጁ ነን። እሱ በጣም ፀረ-የአየር ንብረት ነው-

(gdb) ጭነት

ከሳይግዊን ተርሚናሎች ጋር መሮጥ ፣ አንዳንድ ጊዜ የኮንሶል ትዕዛዞችን ባለማውጣት የሚታወቅ ጉዳይ አለ። ስለዚህ በእኛ ሁኔታ አገልጋዩን የሚያከናውን መስኮት ሙሉ በሙሉ ፀጥ ብሏል። ሸክሙን የሮጥንበት ደንበኛውን የሚያስተዳድረው ይህንን ያስገኛል-

የመጫኛ ክፍል.text ፣ መጠን 0x1c lma 0x8000000 ጀምር አድራሻ 0x8000000 ፣ የመጫኛ መጠን 28 የዝውውር መጠን 1 ኪባ/ሰከንድ ፣ 28 ባይት/ጻፍ።

ደረጃ 13 ከሊኑክስ ጋር ብልጭ ድርግም - የበለጠ ሽልማት - ዲ

ከሊኑክስ ጋር ብልጭ ድርግም - የበለጠ ሽልማት - ዲ
ከሊኑክስ ጋር ብልጭ ድርግም - የበለጠ ሽልማት - ዲ

ደረጃ 14 ትንሽ ጠለቅ ብለን እንውጣ

እዚህ ከደረሱ ፣ በጣም ጥሩ። እንቀጥል።

በዋናው ራስ ፋይል ውስጥ ለምን አስፈፃሚውን አይመለከትም? የሚከተለውን አሂድ

arm-none-eabi-objdump -d main.elf

እንደዚህ ያለ ነገር ውፅዓት ማየት አለብዎት-

main.elf የፋይል ቅርጸት elf32-littlearm

የክፍል መፍረስ። ጽሑፍ

08000000:

8000000: 00 40 01 20 09 00 00 08.@. ….

08000008:

8000008: 4802 ldr r0 ፣ [pc ፣ #8]; (8000014) 800000 ሀ 4685 mov sp ፣ r0 800000c 4f02 ldr r7 ፣ [pc ፣ #8]; (8000018) 800000e - 2000 movs r0 ፣ #0

08000010:

8000010: 3001 r0 ፣ #1 8000012: e7fd b.n 8000010 8000014: 20014000.word 0x20014000 8000018: deadbeef.word 0xdeadbeef

ከላይ ከተጠቀሰው ውጤት ምን ትናንሽ እንጨቶችን ማግኘት እንችላለን?

የ linker.script.ld ፋይልን ስንወያይ እና ስንፈጥር ተመልሰው ካስታወሱ ፣ እነዚህ የ ARM መሣሪያዎች ከ 0x20000000 ጀምሮ ራም አላቸው ፣ እና የ FLASH ማህደረ ትውስታ በ 0x08000000 ይጀምራል።

ስለዚህ ፣ በእርግጥ ፕሮግራሙ ሁሉም በ FLASH ማህደረ ትውስታ ውስጥ እንደሚኖር ማየት እንችላለን።

ከዚያ በላይ ፣ ግን በኋላ ደረጃ ፣ የ “ሰላም ዓለም” ክፍልን ስንቃወም ፣ ወዲያውኑ ፣ ቋሚ ፣ ቃል በቃል እሴት (“0xDEADBEEF”) ወደ MCU ዋና መዝገብ (“R7”) የምንጭንበት መግለጫ አለ።

መግለጫው እንዲህ ነበር -

LDR R7 ፣ = 0xDEADBEEF

በእኛ ኮድ ውስጥ DEADBEEF ን የምንጠቅስበት ብቸኛው ቦታ ይህ ነው። ሌላ የት የለም። ሆኖም ፣ ከላይ የተጠቀሱትን/የተበታተኑ/እንደገና የተገነቡ መመሪያዎችን ፣ ወዘተ ከተመለከቱ ፣ እኛ ከምናስበው በላይ ከ DEADBEEF ጋር የሚዛመድ አለ።

ስለዚህ ፣ አቀናባሪው/አገናኝ በሆነ መንገድ 0x8000018 ላይ የ DEADBEEF ን እሴት ወደ ፍላሽ አድራሻ በቋሚነት ለማንፀባረቅ ወሰነ። እና ከዚያ ፣ አጠናቃሪው ከላይ ያለውን የኤልአርአር መመሪያችንን ቀይሮታል-

LDR R7 ፣ [ፒሲ ፣ #8]

እሱ ለእኛ እንኳን አስተያየት ፈጠረ። እንዴት ደስ ይላል። እና የአሁኑን የፕሮግራም ቆጣሪ ዋጋ (የፒሲ መመዝገቢያውን) መውሰድ ፣ በዚያ እሴት ላይ 0x8 ን ማከል እንዳለብን ይነግረናል ፣ እና ያ DEADBEEF የተቃጠለበት እና ያንን እሴት ያግኙ እና በ R7 ውስጥ ይጭኑት።

ስለዚህ ያ ማለት ደግሞ የፕሮግራሙ ቆጣሪ (ፒሲ) ዋናው_ሎፕ መጀመሪያ የሆነውን 0x8000010 አድራሻ ለማመልከት ነበር ፣ እና የ DEADBEEF እሴት ከዋና_ሎፕ መጨረሻ በኋላ በሁለት አድራሻዎች ላይ ይቀመጣል ማለት ነው።

ደረጃ 15 በመጨረሻ የፕሮግራሙን አሂድ አጭር እይታ

GDB ን ቢያቋርጡም ፣ ትዕዛዙን እንደገና ያስገቡ። ምንም ፋይል እንኳን መስጠት የለብዎትም ፤ እኛ ከአሁን በኋላ ብልጭ ድርግም አንልም ፣ እሱን ብቻ እያሄድን ነው።

አንዴ የ GDB ደንበኛውን ከጂዲቢ አገልጋዩ ጋር እንደገና ካገናኙት ፣ በ (gdb) የትዕዛዝ ጥያቄ ላይ-

(gdb) መረጃ ይመዘግባል

እንደዚህ ያለ ነገር ማየት አለብዎት-

r0 0x0 0

r1 0x0 0 r2 0x0 0 r3 0x0 0 r4 0x0 0 r5 0x0 0 r6 0x0 0 r7 0x0 0 r8 0x0 0 r9 0x0 0 r10 0x0 0 r11 0x0 0 r12 0x0 0 sp 0x20014000 0x20014000 lr 0xffffffffff 42949672

ግን ከዚያ ፣ በ (gdb) ጥያቄ ፣ ያስገቡ

(gdb) ይቀጥሉ

እና በጣም በፍጥነት CTRL-C ን ይምቱ። ያ ፕሮግራሙን ለአፍታ ማቆም አለበት። “የመረጃ መዝገቦች” ትዕዛዙን እንደገና ያስገቡ።

በዚህ ጊዜ ፣ የተለየ ይመስላል -

(gdb) መረጃ ይመዘግባል

r0 0x350ffa 3477498 r1 0x0 0 r2 0x0 0 r3 0x0 0 r4 0x0 0 r5 0x0 0 r6 0x0 0 r7 0xdeadbeef 3735928559 r8 0x0 0 r9 0x0 0 r10 0x0 0r11 16777216 እ.ኤ.አ.

ምንድን ነው የሆነው? እኛ የፈለግነው በትክክል። DEADBEEF ወደ R7 ተጭኗል ፣ እና R0 (እጅግ በጣም ፈጣን) እየጨመረ ነው። ከደገሙ ፣ R0 ን በሌላ እሴት እንደገና ያዩታል።

ደረጃ 16-በፍላሽ ውስጥ ተነባቢ-ብቻ ድርድር መፍጠር እንፈልጋለን

ስብሰባን እና መመሪያዎችን በመጠቀም የድርድርን እኩልነት ለመፍጠር አንደኛው መንገድ እንደሚከተለው ነው

.type myarray ፣ %object // ስሙ ወይም መለያው ‹myarray› እንደ የነገር ዓይነት ይገለጻል።

myarray: // ይህ ‹myarray› // (ምን ያካተተ ነው) የሚለው መግለጫ መጀመሪያ ነው።.word 0x11111111 // 'myarray' ውስጥ የተካተተው የመጀመሪያው አባል ወይም እሴት።.word 0x22222222 // ሁለተኛው እሴት (ተጓዳኝ አድራሻዎች)።.word 0x33333333 // እና የመሳሰሉት።.ማያራይ ፣.

አሁን በ FLASH ማህደረ ትውስታ ውስጥ ስላዋቀርነው በፕሮግራሙ ውስጥ ልንጠቀምበት እንችላለን። ከዚህ በታች አንድ ክፍል አለ

LDR R1 ፣ myarray // ይህ በ ‹myarray› 1 ኛ ቦታ ላይ የተካተተ መረጃን ይጭናል። // እኛ የምንፈልገው አይደለም።

LDR R1 ፣ = myarray // ይህ የአካባቢውን ዋጋ ራሱ (1 ኛ አድራሻ) ይጭናል ፣

// ውሂቡ አይደለም.. // ይህ የምንፈልገው ነው።

MOV R2 ፣ #0 // R2 እኛ ላለመሄዳችን ቆጠራን ይይዛል

// የድርድር መጨረሻ። LDR R3 ፣ = myarrsize // R3 ከ ‹myarrsize› ጋር እኩል ይሆናል።

// R0 የእኛን ውሂብ ይይዛል

ዋና_ሎፕ ፦

LDR R0 ፣ [R1] // በ R1 ('myarray') የተጠቆመውን ውሂብ ወደ R0 ይጫኑ። CMP R2 ፣ R3 // በድርድር ወሰን ላይ ነን? BEQ main_loop // እኛ ከሆንን ጨርሰናል ፣ ስለዚህ እኛ ለዘላለም እንዘልቃለን።

ADD R2 ፣ #1 // አለበለዚያ ፣ በድርድር ውስጥ መደጋገማችንን መቀጠል እንችላለን።

R1 ን ፣ #4 // R1 ን ለመመዝገብ 4 ያክሉ ፣ ስለዚህ ወደሚቀጥለው በትክክል ያመላክታል

// አድራሻ..

ቢ main_loop // ወደ ኋላ ተመለስ።

ቪዲዮው ይህንን ሁሉ ያልፋል ፣ እና በውስጡም ስህተት አለ። ጥሩ ነው; እሱ አስፈላጊ የሩጫ እና የማረም ኮድ መሆኑን ያሳያል። ከድርድር መጨረሻ ወጥቶ የመራመድን የተለመደ ሁኔታ ያሳያል።

የሚመከር: