2022/12/15 社内勉強会向け資料です。 TDDでLEDデバイスドライバをターゲットマイコンで実施する考えをまとめました。
リンクが有効な資料はこちらにあります。 https://www.docswell.com/s/juraruming/KN4MW5-2022-12-15-210619
ʲ࿈ଓߨ࠲ #7ʳTDD #3 LEDドϥΠバ(λʔήοτฤ)2022/12/15ύʔιϧςΫϊϩδʔελοϑגࣜձࣾѨ෦ߞೋ [email protected]ΈࠐΈιϑτΣΞجૅ
View Slide
• ࣗݾհ• ࢀՃऀҰݴίϝϯτ• ߨ࠲։࠵ͷഎܠɾత• ຊͷςʔϚʲLEDドϥΠバ(λʔήοτฤ)ʳ• TDDֶशͷࢀߟ• ࢀՃऀײ• ࣍ճ༧ࠂ࣍2
• Ѩ෦ɹߞೋʢ͋ɹ͜͏͡ʣ• ٕज़ຊ෦ɹػిٕज़෦ɹटݍ2G• [email protected]• ҩྍػث։ൃ• ࠐΈιϑτΣΞ։ൃɻCݴޠɺϕΞϝλϧͷ։ൃۀܦݧ͕΄ͱΜͲɻ• LAPRASϙʔτϑΥϦΦɿhttps://lapras.com/public/k-abe• twitter: @jurarumingࣗݾհ3
ࣗ͝༝ʹҰݴίϝϯτ͍͚ͨͩ·͢ͱ͋Γ͕͍ͨͰ͢ɻྫ) ໊͓લྫ) ࠓճͷߨ࠲ʹظ͢Δ͜ͱྫ) ͓ࣄ༰(ͤΔൣғͰ)ྫ) ιϑτΣΞ։ൃ୲ఔ(ཁٻ༷ͷఆٛ?ઃܭ?࣮?ςετ?)ࢀՃऀҰݴίϝϯτ4
• ͳʹ͔ςʔϚΛܾΊͯɺιϑτΣΞ։ൃͷ্ྲྀఔ͔ΒԼྲྀఔ·Ͱઆ໌͢Δߨ࠲Λ։࠵͠ɺεΩϧΞοϓΛਤΔɻɹ˙#1 ཁٻ༷ͷཧղɹࢿྉɾهࣄɹ˙#2 ཁٻ༷ͷ༷Խɹࢿྉɾهࣄɹ˙ઃܭɹɹɹ˔#3 ֓ཁɹࢿྉɾهࣄɹɹ˔#4 ৄࡉɹࢿྉɾهࣄɹ˙TDDɹɹ˔#5 ςετۦಈ։ൃ#1 ͡ΊͷҰาɹࢿྉɾهࣄɹɹ˔#6 ςετۦಈ։ൃ#2 LEDυϥΠό(ϗετPCฤ)ɹࢿྉɾهࣄɹɹ˔#7 ςετۦಈ։ൃ#3 LEDυϥΠό(λʔήοτฤ) ˒͍·͜͜ɹɹ˔#8ɹɹ˔#9ɹɹߨ࠲։࠵ͷഎܠɾత5
ςʔϚɿʲطଘࠐΈ(CQ EVΧʔτ)ͷϚΠίϯΛҠ২͢Δʳߨ࠲։࠵ͷഎܠɾత6
ςʔϚɿʲطଘࠐΈͷϚΠίϯΛҠ২͢ΔʳରஔɿCQ EVΧʔτഎܠɿɾߨࢣ͕͓࣋ͬͯΓɺରஔͷυϝΠϯࣝΛཧղ͍ͯ͠ΔɻɾιϑτΣΞͷߏΛཧղ͍ͯ͠ΔɻɾରஔͷϚΠίϯ͕৽ن࠾༻ඇਪʹͳͬͨɻɹ⇛ֶशɾεΩϧΞοϓͷͨΊผϚΠίϯʹҠ২ͯ͠ΈΑ͏!!!ɹߨ࠲։࠵ͷഎܠɾత7
• LEDドϥΠバ(λʔήοτฤ)ͱԿ͔?• λʔήοτͰTDDΛ͢ΔϝϦοτɾσϝϦοτ• ࠐΈιϑτΣΞͷςετઓུ• λʔήοτͰTDD͢Δ۩ମతํ๏ຊͷςʔϚʲLEDドϥΠバ(λʔήοτฤ)ʳ8
• LEDドϥΠバ(λʔήοτฤ)ͱԿ͔?• λʔήοτͰTDDΛ͢ΔϝϦοτɾσϝϦοτ• ࠐΈιϑτΣΞͷςετઓུ• λʔήοτͰTDD͢Δ۩ମతํ๏ຊͷςʔϚʲLEDドϥΠバ(λʔήοτฤ)ʳ9
• λʔήοτͱ?ɹϚΠίϯλʔήοτϘʔυͰTDD͢Δ͜ͱΛࢦ͢ɻɹલճϚΠίϯΛίϯύΠϧ͢ΔPC(ϗετ)ͰTDDͨ͠ɻ• LEDυϥΠόͱ?• ϚΠίϯλʔήοτϘʔυͱ?ɹ࣍ϖʔδҎ߱ʹॻ͖·͢ɻLEDドϥΠバ(λʔήοτฤ)ͱԿ͔?10
ɾLEDυϥΠόͱ?▪EVΧʔτͷLEDΛ౮ɾফ౮͢ΔػೳΛ࣋ͭσόΠευϥΠόͱ͢ΔɻɹϞʔλʔݱࡏҐஔͱ੍ޚͷঢ়گΛͭͷ-&%Ͱࢹ֮ԽͰ͖Δɻ11
●λʔήοτϚΠίϯͷબఆɹSTϚΠΫϩΤϨΫτϩχΫεͷSTM32ϚΠίϯϘʔυʲNUCLEO-F446REʳʹܾΊͨɻɾSTM32F446RET6 64ϐϯɾArm Cortex-M4ίΞ 180MHzɾϑϥογϡ: 512KbyteɾSRAM: 128KbyteɾArm MbedରԠ12
• LEDドϥΠバ(λʔήοτฤ)ͱԿ͔?• λʔήοτͰTDDΛ͢ΔϝϦοτɾσϝϦοτ• ࠐΈιϑτΣΞͷςετઓུ• λʔήοτͰTDD͢Δ۩ମతํ๏ຊͷςʔϚʲLEDドϥΠバ(λʔήοτฤ)ʳ13
ʲϝϦοτʳ▪λʔήοτͰಈ࡞֬ೝͰ͖҆৺Ͱ͖Δ▪ϗετɺλʔήοτͷҧ͍Λ֬ೝͰ͖Δɻ●ϋʔυΣΞͷॳظԽ●ΞʔΩςΫνϟͷҧ͍●࣮ߦڥͷҧ͍(ελοΫɺͦͷଞ)●ίϯύΠϥͷҧ͍●ϥΠϒϥϦͷڍಈͷҧ͍λʔήοτͰTDDΛ͢ΔϝϦοτɾσϝϦοτ14
ʲϝϦοτʳ▪ϗετɺλʔήοτͷҧ͍Λ֬ೝͰ͖Δɻ●ϋʔυΣΞͷॳظԽɹϗετͰϋʔυΣΞΛॳظԽ͢ΔίʔυΛॻ͔ͳ͍ɻɹλʔήοτͰϋʔυΣΞΛςετ͢ΔͨΊʹॳظԽͷ࣮͕ඞཁɹ(LEDυϥΠόͰ͋ΕGPIOͷग़ྗϙʔτͷઃఆͳͲ)ɻλʔήοτͰTDDΛ͢ΔϝϦοτɾσϝϦοτ15
ʲϝϦοτʳ▪ϗετɺλʔήοτͷҧ͍Λ֬ೝͰ͖Δɻ●ΞʔΩςΫνϟͷҧ͍ྫ) intܕͷΞυϨεԋࢉɹϗετ) 32bitɾ64bitͷCPU intܕͷαΠζ 4όΠτɹλʔήοτ) 16bitϚΠίϯ intܕͷαΠζ2byteɹ͠ɺintܕͷϙΠϯλΞυϨεԋࢉͳͲ͍ͯͨ͠Βڍಈ͕ҟͳΔɻྫ) ΤϯσΟΞϯɹϏοάɾϦτϧΤϯσΟΞϯʹґଘ͢ΔίʔυͩͬͨΒڍಈ͕ҟͳΔɻλʔήοτͰTDDΛ͢ΔϝϦοτɾσϝϦοτ16
ʲϝϦοτʳ▪ϗετɺλʔήοτͷҧ͍Λ֬ೝͰ͖Δɻ●࣮ߦڥͷҧ͍(ελοΫɺͦͷଞ)ɹλʔήοτϚΠίϯͷ։ൃڥʹଐ͍ͯ͠ΔελʔτΞοϓϧʔνϯͰσϑΥϧτͰઃఆ͍ͯ͠ΔελοΫαΠζ500byteͩͬͨͱԾఆɻɹ͋Δؔͷ෦มͰ500byteͷྻΛએݴͨ͠߹ɻɹϗετͰ͋Εಈ͘ͱࢥ͏͕λʔήοτϚΠίϯͰόάΔՄೳੑ͋ΓɻɹϗετͰ͋Εߟྀ͠ͳͯ͘ྑ͍͜ͱ͕(ʹͳΒͳ͍͜ͱ͕ଟ͍)ɺλʔήοτϚΠίϯͰߟྀ͕ඞཁͳ߹͕͋ΔɻλʔήοτͰTDDΛ͢ΔϝϦοτɾσϝϦοτ17
ʲϝϦοτʳ▪ϗετɺλʔήοτͷҧ͍Λ֬ೝͰ͖Δɻ●ίϯύΠϥͷҧ͍ɾ࠷దԽʹΑΓϗετɾλʔήοτͰڍಈ͕ҟͳΔ߹ɻɾϝϞϦͷΞϥΠϝϯτ●ϥΠϒϥϦͷڍಈͷҧ͍ɾඪ४ϥΠϒϥϦͷڍಈͷҧ͍ɾόάͳͲɻɹྫ) sprintf͕ϗετɾλʔήοτͰಈ͖͕ҧ͏ͳͲɻλʔήοτͰTDDΛ͢ΔϝϦοτɾσϝϦοτ18
ʲσϝϦοτʳɹσϝϦοτ͋Μ·Γࢥ͍͖ͭ·ͤΜͰͨ͠ɻɹλʔήοτͰTDDͰ͖ΔͷͰ͋Εͨ͠ํ͕ྑ͍ͱࢥ͏ɻ▪ςετίʔυΛॻ͘ͷͰ͕͔͔࣌ؒΔɻɹʲςετΛॻ͔ͳ͍͔Β͕࣌ؒͳ͘ͳΔʳͱ͍͏໊ݴ͋Γ·͢ɻλʔήοτͰTDDΛ͢ΔϝϦοτɾσϝϦοτ19
• LEDドϥΠバ(λʔήοτฤ)ͱԿ͔?• λʔήοτͰTDDΛ͢ΔϝϦοτɾσϝϦοτ• ࠐΈιϑτΣΞͷςετઓུ• λʔήοτͰTDD͢Δ۩ମతํ๏ຊͷςʔϚʲLEDドϥΠバ(λʔήοτฤ)ʳ20
▪ࠐΈιϑτΣΞ։ൃݱͷΈ●1ͭͷϋʔυͰςελʔ͕ෳɹ͍͔ʹϋʔυΣΞΛΘͣʹςετͰ͖Δ͔͕ϙΠϯτɻɹ●ࢀߟʹͳͬͨهࣄɹΦϒδΣΫτࢦͷຊ࣭ɾґଘੑͷ͍ιϑτΣΞϞδϡʔϧͷઃܭɻɾγϛϡϨʔλΛ༻ͨ͠ςετڥͷߏஙɹɹɹTDDΛΔ߹ϗετͰΔ͜ͱɺλʔήοτͰΔ͜ͱΛ໌֬Խ͠ςετͷઓུΛཱͯΔ͜ͱ͕ॏཁͱײͨ͡ɻࠐΈιϑτΣΞͷςετઓུ21
• LEDドϥΠバ(λʔήοτฤ)ͱԿ͔?• λʔήοτͰTDDΛ͢ΔϝϦοτɾσϝϦοτ• ࠐΈιϑτΣΞͷςετઓུ• λʔήοτͰTDD͢Δ۩ମతํ๏ຊͷςʔϚʲLEDドϥΠバ(λʔήοτฤ)ʳ22
▪λʔήοτͷڥ▪ํ▪࣮ྫͷհ▪ಈ࡞֬ೝ݁ՌλʔήοτͰTDD͢Δ۩ମతํ๏23
▪λʔήοτͷڥ▪ํ▪࣮ྫͷհ▪ಈ࡞֬ೝ݁ՌλʔήοτͰTDD͢Δ۩ମతํ๏24
▪λʔήοτͷڥɾSTM32CubeIDE Version: 1.11.0ɾςετϑϨʔϜϫʔΫ: CppUTest 4.0λʔήοτͰTDD͢Δ۩ମతํ๏25
▪λʔήοτͷڥ▪ํ▪࣮ྫͷհ▪ಈ࡞֬ೝ݁ՌλʔήοτͰTDD͢Δ۩ମతํ๏26
▪ํɾϗετͱςετίʔυΛڞ༗͢ΔɻɾϗετͱλʔήοτͰίʔυͷΓସ͑ϚΫϩͰߦ͏ɻɾLED౮STM32ͷϋʔυΣΞநԽϨΠϠʔ(௨শɿHAL)ͷίʔυΛ༻͢ΔɻɹϝϦοτ) ࠐΈ؆୯σϝϦοτ)ɹɾॲཧͷԽɺͷ(͕͋Δ͔͠Εͳ͍ɾɾɾ)ɹɾϋʔυΣΞநԽϨΠϠͷίʔυࣗମͷόά͕͋Δ͔͠Εͳ͍ɻλʔήοτͰTDD͢Δ۩ମతํ๏27
▪ํʼϋʔυΣΞநԽϨΠϠʔɹGPIOͷWriteͷྫ)λʔήοτͰTDD͢Δ۩ମతํ๏28
▪λʔήοτͷڥ▪ํ▪࣮ྫͷհ▪ಈ࡞֬ೝ݁ՌλʔήοτͰTDD͢Δ۩ମతํ๏29
▪࣮ྫͷհɹϗετͰTDDͨ͠ͱ͖ͷσΟϨΫτϦߏλʔήοτͰTDD͢Δ۩ମతํ๏30
▪࣮ྫͷհϗετɾλʔήοτͰTDD͢Δͱ͖ͷσΟϨΫτϦߏҊ(Ϗϧυɾಈ࡞ະ֬ೝ)ɹλʔήοτͰTDD͢Δ۩ମతํ๏31host: ϗετͰTDD͢Δͱ͖ͷϑΝΠϧΛ֨ೲ͢Δɻtarget: λʔήοτͰTDD͢Δͱ͖ͷϑΝΠϧΛ֨ೲ͢Δɻinclude: ΠϯΫϧʔυϑΝΠϧ֨ೲ༻ɻϗετɾλʔήοτͰڞ௨Ͱ༻͢Δɻsrc: ιʔεϑΝΠϧ֨ೲ༻ɻϗετɾλʔήοτͰڞ௨Ͱ༻͢Δɻtests: ςετίʔυ֨ೲ༻ɻϗετɾλʔήοτͰڞ௨Ͱ༻͢Δɻ●ϗετɾλʔήοτͰڞ௨Ͱ༻͢Δͷhost, targetσΟϨΫτϦͷ֎ʹஔ͘ͱ͍͏ํɻɹTDDֶशͷࢀߟ(4)Λࢀߟʹ͍͍ͤͯͨͩͨ͞ɻ
▪࣮ྫͷհλʔήοτσΟϨΫτϦߏҊ(Ϗϧυɾಈ࡞ະ֬ೝ)ɹλʔήοτͰTDD͢Δ۩ମతํ๏32▪446re_test: ϝΠϯϓϩδΣΫτɻϚΠίϯʹॻ͖ࠐΉϑΝΠϧΛ࡞͢Δɻ
▪ ࣮ྫͷհςετίʔυ(HallSensorLedDriverTest.cpp)Λλʔήοτ͚ʹमਖ਼͢Δඞཁ͋Γ// υϥΠόΛॳظԽͨ͠Βɺͯ͢ͷLED͕ফ౮͍ͯ͠ΔTEST(HallSensorLedDriver, LedsOffAfterCreate){unsigned char virtualLeds = 0xff;HallSensorLedDriver_Create(&virtualLeds);BYTES_EQUAL(0, virtualLeds);}// ϗʔϧηϯαʔU͕1ͷ߹ɺϗʔϧηϯαʔLEDΛΦϯʹ͢ΔTEST(HallSensorLedDriver, TurnOnHallULed){unsigned char virtualLeds;HallSensorLedDriver_Create(&virtualLeds);HallSensorLedDriver_TurnOn(0x04);BYTES_EQUAL(0x04, virtualLeds);}// ϗʔϧηϯαʔU͕0ͷ߹ɺϗʔϧηϯαʔLEDΛΦϑʹ͢ΔTEST(HallSensorLedDriver, TurnOffHallULed){unsigned char virtualLeds;HallSensorLedDriver_Create(&virtualLeds);HallSensorLedDriver_TurnOn(0x04);HallSensorLedDriver_TurnOff(0x04);BYTES_EQUAL(0x00, virtualLeds);}λʔήοτͰTDD͢Δ۩ମతํ๏33ϗετͷ߹virtualLedsҙͷΞυϨεͰྑ͔ͬͨ(LED͕ͳ͍ͨΊ)ɻ
▪࣮ྫͷհϓϩμΫτίʔυ(HallSensorLedDriver.c)Λλʔήοτ͚ʹमਖ਼void HallSensorLedDriver_Create(unsigned char* address){// *address = 0;hallSensorLedsAddress = address;*hallSensorLedsAddress = 0;}void HallSensorLedDriver_Destroy(void){}void HallSensorLedDriver_TurnOn(unsigned charledBitNumber) {*hallSensorLedsAddress = 0x04;}void HallSensorLedDriver_TurnOff(unsigned charledBitNumber){*hallSensorLedsAddress = 0x00;}λʔήοτͰTDD͢Δ۩ମతํ๏34ɾλʔήοτͷ߹*_CreateͰLEDΛফ౮͢ΔॳظԽॲཧ͕ඞཁɻ
▪λʔήοτͷڥ▪ํ▪࣮ྫͷհ▪ಈ࡞֬ೝ݁ՌλʔήοτͰTDD͢Δ۩ମతํ๏35
▪ಈ࡞֬ೝ݁Ռɹظ͍͍͍ͨͩͯͨΒਃ͠༁͋Γ·ͤΜɻɹλʔήοτͰTDDΛಈ࡞֬ೝ͢Δ·ͰࢸΓ·ͤΜͰͨ͠ɻλʔήοτͰTDD͢Δ۩ମతํ๏36
1. ςετۦಈ։ൃʹΑΔΈࠐΈϓϩάϥϛϯά2. ʦಈըͰղઆʧాਓͷ“ςετۦಈ։ൃ”ߨ࠲ هࣄҰཡ3. ʰςετۦಈ։ൃʹΑΔΈࠐΈϓϩάϥϛϯάʱΛಡΜͰֶΜͩ͜ͱ4. TDDʹΑΔϚΠίϯͷLνΧ։ൃ(1)5. TDDʹΑΔϚΠίϯͷLνΧ։ൃ(2)()TDDֶशͷࢀߟ37
• ੋඇͱߨ࠲ͷײΛҰݴ͓ئ͍͠·͢ɻࢀՃऀײ38
ɹTDDͷߨ࠲ͷ࣍ճʲ1/xx(x) 19:30ʙ20:30ʳͰ։࠵༧ఆͰ͢ɻʲ࿈ଓߨ࠲ #8ʳςετۦಈ։ൃ#4 xxxɹࢀՃͷํɺੋඇͱΑΖ͓͘͠Ͷ͕͍͠·͢ɻ࣍ճ༧ࠂ39ߟ͑தɾɾɾ
• ςʔϚͷલఏઆ໌ʲCQ EVΧʔτʳͱ???ɾಈը1: ߦதɾಈը2: ج൘Λ֦େաڈʹॻ͍ٕͨज़ॻ(EV Χʔτで࢝ΊΔϞデϧベʔε։ൃ)Λϕʔεʹઆ໌͠·͢ɻهࡌՕॴɿʲୈ1ষ EVΧʔτͱԿ͔ʳࢀߟʲςʔϚͷલఏઆ໌ʳ40
͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ɻऴΘΓ41