Страница 1 из 1

Памятка начинающему эмбеддеру-прошивкописателю.

Добавлено: 11 июл 2012, 09:08
alex34
Предлагаю всем отписаться на тему типичных ошибок и рекомендаций эмбеддерского прошивкописательства. Списком, рекомендации из серии "не пользуйся магическими числами в тексте", "задавай их в дефайнах" или "не пиши длинных обработчиков прерываний" и.т.д.... с миру по нитке )

Re: Памятка начинающему эмбеддеру-прошивкописателю.

Добавлено: 11 июл 2012, 09:15
BSVi
Объявляй volatile все, что используется и в прерывании и где-то еще.

Re: Памятка начинающему эмбеддеру-прошивкописателю.

Добавлено: 11 июл 2012, 10:45
Qic
От себя могу добавить.
Словил баг когда на 8битном авр гонял переменную 32бита.
Либо 8бит, либо 1 слово - переменные должны наиболее точно соответствовать архитектуре.

Re: Памятка начинающему эмбеддеру-прошивкописателю.

Добавлено: 11 июл 2012, 12:01
Pavlya
Одни из граблей, на которые я наступал - выравнивание структур на различных архитектурах. Размер структуры типа:

Код: Выделить всё

struct somestruct{
    uint8_t   var1;
    uint16_t var2;
};

может оказаться совершенно разным

Re: Памятка начинающему эмбеддеру-прошивкописателю.

Добавлено: 11 июл 2012, 12:09
BSVi
Да-да, в таких случаях нужно использовать #pragma pack

Re: Памятка начинающему эмбеддеру-прошивкописателю.

Добавлено: 14 июл 2012, 21:22
Qic
<xxx> и запомние дети
<xxx> если при поиске бага вы с уверенностью и непоколебимостью
<xxx> пропускаете кусок кода мимо внимания
<xxx> т.к. "ну я же не могу быть настолько мудаком, чтоб доцстить ошибку там!"
<xxx> знайте, вы - можете
<xxx> =(

-Сегодня очередную железку разрабатывал, в одном месте кусок кода отключил для отладки, забыл включить потом xD (минус пол часа), в другом месте при копировании куска кода точку с запятой потерял...

Re: Памятка начинающему эмбеддеру-прошивкописателю.

Добавлено: 15 июл 2012, 06:37
alex34
Больше похоже на законы Мёрфи

Re: Памятка начинающему эмбеддеру-прошивкописателю.

Добавлено: 15 июл 2012, 14:50
Qic
Правда что =) А по сути они и есть.

Re: Памятка начинающему эмбеддеру-прошивкописателю.

Добавлено: 16 июл 2012, 01:12
tetraa
BSVi писал(а):Да-да, в таких случаях нужно использовать #pragma pack

А что случиться то может?

Re: Памятка начинающему эмбеддеру-прошивкописателю.

Добавлено: 16 июл 2012, 13:38
Pavlya
Предположим, что два микропроцессора обмениваются по шине данных некоторыми пакетами. Пакет состоит из заголовка и некой полезной нагрузки. Заголовок имеет вид:

Код: Выделить всё

struct header_t{
uint8_t   type;
uint16_t seq;
};


У нас есть некий буфер, в который мы принимаем данные:

Код: Выделить всё

uint8_t rxbuf[SIZE];


После того, как данные были приняты, выделяем заголовок:

Код: Выделить всё

header_t  * hdr;
hdr = (header_t *)rxbuf;


И вот теперь начинается самое интересное. При выравнивании по границе 1 байт sizeof(hdr.type) вернет 1. То есть значение type будет лежать в rxbuf[0];
А при выравнивании по границе 2 байт sizeof(hdr.type) вернет 2. То есть значение type будет лежать в rxbuf[0] и rxbuf[1]; Соответственно заголовок займет не три байта а четыре и структура пакета будет нарушена.
#pragma pack в данном случае позволяет задать границу выравнивания. Выглядит примерно так:

Код: Выделить всё

#pragma pack(push,1)

struct header_t{
uint8_t   type;
uint16_t seq;
};

#pragma pack(pop)

Re: Памятка начинающему эмбеддеру-прошивкописателю.

Добавлено: 22 дек 2012, 19:26
Drunya
А как быть с GCC? Он вроде не знает прагму. Я не выделываюсь, я реально не в курсе:)

Re: Памятка начинающему эмбеддеру-прошивкописателю.

Добавлено: 23 дек 2012, 13:12
BSVi
Знает.

Re: Памятка начинающему эмбеддеру-прошивкописателю.

Добавлено: 19 апр 2025, 11:35
yaachii

Re: Памятка начинающему эмбеддеру-прошивкописателю.

Добавлено: 02 май 2025, 11:56
yaachii
audiobookkeepercottageneteyesvisioneyesvisionsfactoringfeefilmzonesgadwallgaffertapegageboardgagrulegallductgalvanometricgangforemangangwayplatformgarbagechutegardeningleavegascauterygashbucketgasreturngatedsweepgaugemodelgaussianfiltergearpitchdiameter
geartreatinggeneralizedanalysisgeneralprovisionsgeophysicalprobegeriatricnursegetintoaflapgetthebouncehabeascorpushabituatehackedbolthackworkerhadronicannihilationhaemagglutininhailsquallhairyspherehalforderfringehalfsiblingshallofresidencehaltstatehandcodinghandportedheadhandradarhandsfreetelephone
hangonparthaphazardwindinghardalloyteethhardasironhardenedconcreteharmonicinteractionhartlaubgoosehatchholddownhaveafinetimehazardousatmosphereheadregulatorheartofgoldheatageingresistanceheatinggasheavydutymetalcuttingjacketedwalljapanesecedarjibtypecranejobabandonmentjobstressjogformationjointcapsulejointsealingmaterial
journallubricatorjuicecatcherjunctionofchannelsjusticiablehomicidejuxtapositiontwinkaposidiseasekeepagoodoffingkeepsmthinhandkentishglorykerbweightkerrrotationkeymanassurancekeyserumkickplatekillthefattedcalfkilowattsecondkingweakfishkinozoneskleinbottlekneejointknifesethouseknockonatomknowledgestate
kondoferromagnetlabeledgraphlaborracketlabourearningslabourleasinglaburnumtreelacingcourselacrimalpointlactogenicfactorlacunarycoefficientladletreatedironlaggingloadlaissezallerlambdatransitionlaminatedmateriallammasshootlamphouselancecorporallancingdielandingdoorlandmarksensorlandreformlanduseratio
languagelaboratorylargeheartlasercalibrationlaserlenslaserpulselatereventlatrinesergeantlayaboutleadcoatingleadingfirmlearningcurveleavewordmachinesensiblemagneticequatormagnetotelluricfieldmailinghousemajorconcernmammasdarlingmanagerialstaffmanipulatinghandmanualchokemedinfobooksmp3lists
nameresolutionnaphtheneseriesnarrowmouthednationalcensusnaturalfunctornavelseedneatplasternecroticcariesnegativefibrationneighbouringrightsobjectmoduleobservationballoonobstructivepatentoceanminingoctupolephononofflinesystemoffsetholderolibanumresinoidonesticketpackedspherespagingterminalpalatinebonespalmberry
papercoatingparaconvexgroupparasolmonoplaneparkingbrakepartfamilypartialmajorantquadruplewormqualityboosterquasimoneyquenchedsparkquodrecuperetrabbetledgeradialchaserradiationestimatorrailwaybridgerandomcolorationrapidgrowthrattlesnakemasterreachthroughregionreadingmagnifierrearchainrecessionconerecordedassignment
rectifiersubstationredemptionvaluereducingflangereferenceantigenregeneratedproteinreinvestmentplansafedrillingsagprofilesalestypeleasesamplingintervalsatellitehydrologyscarcecommodityscrapermatscrewingunitseawaterpumpsecondaryblocksecularclergyseismicefficiencyselectivediffusersemiasphalticfluxsemifinishmachiningspicetradespysale
stunguntacticaldiametertailstockcentertamecurvetapecorrectiontappingchucktaskreasoningtechnicalgradetelangiectaticlipomatelescopicdampertemperateclimatetemperedmeasuretenementbuildingtuchkasultramaficrockultraviolettesting