Jump to content

C++ un mikrokontrolieri


Jurkins
 Share

Recommended Posts

Skaidrs, ka visiem prātā krāna nojaukšana un karš Ukrainā, bet nu, īstenībā jau dzīve neapstājas.

Kā zināms 🤣, man laiku pa laikam uznāk paitona saasinājums, pa laikam c++ saasinājums, pa laikam pastiprinātāju saasinājums, u.t.t.

Uznāca c++ saasinājums 🤣. Noskatījos pāris lekcijas par "value based" pārākumu par "type based" metodi (vai kā to nosaukt). Nu un sarakstīju variantu avr, konkrēti populārās atmega 328 - arduino uno, arduino pro nano, laikam vēl kaut kādi I/O portu padarīšanai.

 

Var rakstīt kaut kā tā. 

#include <avr/io.h>
#include "main.h"
#include "atmega_328.h"


using lcd_7 = pb6;
using lcd_6 = pb5;
using lcd_5 = pd0;
using lcd_4 = pd1;
using lcd_3 = pc5;
using lcd_2 = pb1;
using lcd_1 = pb3;
using lcd_0 = pc6;

using LCD = IOport<lcd_7, lcd_6, lcd_5, lcd_4, lcd_3, lcd_2, lcd_1, lcd_0 >;
int main(void)
{
	LCD::AsOutput();
	LCD::Write(0b1111'1111);
  	LCD::AsInput();
  	uint8_t v = LCD::Read();
  
    while (1) 
    {
    }
}

Assemblers gandrīz ideāls.

Nav problēmu noportēt uz stm32. Viss strādā.

Jautājums... visām funkcijām ar portu kods ir divi varianti - rakstīt vai lasīt kaut ko.

template<class Tport, class ... Tports>
	static inline void dir_as_input_imp(type_pack<Tport, Tports ... >)
	{
		dir_as_input_imp(type_pack<Tport>{});
		dir_as_input_imp(type_pack<Tports...>{});
	}
	template<class Tport>
	static inline void dir_as_input_imp(type_pack<Tport>)
	{
		constexpr auto port_lines = port_line_pack(just_type<Tport>{}, pin_pack);
		if constexpr(Tport::port_length == size_of_pack(port_lines))
			Tport::AsInput();
		else
		{
			constexpr auto port_mask = mask_of_pinpack(port_lines);
			Tport::AsInput(port_mask);
		}
	}

Atšķirība ir tikai izsaucamā funkcija - šajā gadījumā Tport::AsInput(). Tupīju vēl tajos templeitos. Vai var kaut kādā veidā šo funkciju padot kā parametru?

main.h atmega_328.h type_traits.h

  • Atbalstu 1
Link to comment
Share on other sites

AndrisBB

Neko nezinu par tēmu un kāds ir jautājums, bet ...

 

Realitāte ir tāda ka tāds kods ir pārāk sarežģīts, tapēc visdrīzāk tiktu izmests un netiktu apstiprināts. Nu vismaz es neapstiprinātu, it īpaši uz mikrokontrolieliem vai kautvai kautkur sistēmas līmenī.

Laiks ir nauda, ja kādam jātērē laiks, lai tam izburtos cauri, vai nedod dievs vajag debuggot, kad kautkas neiet.

 

Nu akadēmisku iemeslu pēc jau var kautko čakarēties, bet ne reālajā dzīvē.

Labots - AndrisBB
Link to comment
Share on other sites

Jurkins
Pirms 9 minūtēm , AndrisBB teica:

nedod dievs vajag debuggot, kad kautkas neiet.

kāpēc neiet? Viss iet. Un vienmēr. Tas kods ir jāuzraksta tikai vienreiz. Pēc tam nevajag rakstīt vairs.

Jautājums - vai var kā parametru funkcijas šablonam padot klases šablona funkciju?

 

Pirms 15 minūtēm , AndrisBB teica:

bet ne reālajā dzīvē.

Nu jā, tas nav mans maizes darbs.

Link to comment
Share on other sites

AndrisBB
Pirms 3 minūtēm , Jurkins teica:

kāpēc neiet? Viss iet. Un vienmēr.

Nav tāda koda kas vienmēr ietu :D vienmēr kautkas neiet, it īpaši ja mazliet vairāk par divām funkcijām.

Link to comment
Share on other sites

AndrisBB

Iedomājies tev jādebuggo kautkādu problēma, kas notiek vienreiz pilnmēnesī, tu atver kodu ko nekad neesi redzējis un tur kādas 50k rindas ar kautko tādu. :D

 

 

Ne velti ir tāds KISS princips.

  • Patīk 1
  • Haha 1
Link to comment
Share on other sites

Jurkins

@AndrisBB, ja paskatās uz arduino vai tā paša stm standarta rsisinājumiem, tad mani kā neprofesionālu programmētāju pārņem izmisums 🤣.

Tāpēc jau tagad ir tā, ka parasta aplikācija ir ap 1GB 😁

Bija te variants. Cilvēks uz C# uzraksta kaltēm aplikāciju. Viss it kā darbojas, bet ir gadījumi, kad uzkaras... nu nevar saprast kas tur īsti par lietu, reizēm gļuko, bet ja to koda gabalu ieliek iekš "try... except", tad iet. ĀĀĀĀĀ! Skaidrs, ka iet....

Pirms 2 minūtēm , AndrisBB teica:

kautkādu problēma, kas notiek vienreiz pilnmēnesī,

Bet kāpēc tādā vienkāršā kodā kaut kam jānotiek reizi pilnmēnesī? Ja šis ir sarežģīts kods, tad...

Pirms 4 minūtēm , AndrisBB teica:

50k rindas

Tāpēc jau jautāju... nezinu, vai pareizi formulēju... bet vai var klases šablona funkciju padot kā parametru funkcijas šablonam?

Link to comment
Share on other sites

AndrisBB

Kodam ir tieksme mainīties nepārtraukti, kautkas jāpieliek, kautkas jāpamaina, nav tā ka vienreiz uzraksti un tad iet mūžiem.

Pat ja tas konkrētais kods iet bez problēmām, tad tas nenozīmē ka pēc gada, kad kautko vajadzēs pamainīt, tu pats atcerēsies ka vispār rakstiji to kodu un čortosies, kurš tādus murgus sarakstījis.

Ja nu tomēr kautkas neiet, tad tu jau nezini, niet tur vai kautkur citur. Bet ja kāds cits pēc mēneša mēģina debuggot, tad viņam būs jāpavada ilgs laiks lai vispār saprastu kas tur domāts.

Nav jau arī tā ka ja tas kods kompilējas ar gcc 8, tad viņs kompilēsies un darbosies korekti pēc mēneša ar gcc 9, vai vispār citu kompilieri uz kādas citas sistēmas.

Visā tajā C++ maģijā, ir miljoniem lietu kas var aiziet greizi.

Vispār jau Templeiti uz Mikrokontroliera pa lielam ir liels 'no no' jebkurā gadījumā.

Link to comment
Share on other sites

Jurkins
(labots)

Kāda starpība uz mikrokontroliera vai kur citur? Tā ir vienkārši metaprogrammēšana - kods, kurš izveido kodu. Kas mk I/O var mainīties?

Tad jau praktiski gan std gan stl var norakstīt.

 

Ja ir iznācis uz gcc c++20 un kāds leito gcc ar cc++03, tad... :(. Visur tak jābūt attīstībai 😁.

Labots - Jurkins
Link to comment
Share on other sites

AndrisBB
Pirms 16 minūtēm , Jurkins teica:

bet vai var klases šablona funkciju padot kā parametru funkcijas šablonam?

Ganjau ka var, kapēc lai nevarētu? Atbildi gan nezinu, no templeitiem parasti izvairos, lietoju tik ja nu galīgi baigi vajag.

Pirms 2 minūtēm , Jurkins teica:

Tad jau praktiski gan std gan stl var norakstīt.

Uz MCU jau parasti arī visādus vektorus utt diezko neizmanto. Pārāk bīstami.

Link to comment
Share on other sites

Jurkins
Just now, AndrisBB teica:

no templeitiem parasti izvairos, lietoju tik ja nu galīgi baigi vajag.

Nu ja, es neesmu programmētājs un tas nav mans maizes darbs, bet patīk gan.

Link to comment
Share on other sites

AndrisBB

Tevis paša pieminētajos STM standartrisinājumos. Esi redzējis kaut vienu std, stl utt?

Link to comment
Share on other sites

Jurkins

Neesmu. Stm standartrisinājumi ir kaut kas šausmīgs. Īstenībā, domāju, ka tas ir marokāņu 😁programmistu nopelns. Bet dīvaini. Mani parasti šeit lamā par stagnātu😁.  Savukārt es esmu pilnīgi atvērts c++23😁... nu jā, zinu gan jau 1% no c++20.

Link to comment
Share on other sites

Jurkins
Pirms 9 minūtēm , AndrisBB teica:

Pārāk bīstami

Var par šo konkrētāk? Kāpēc bīstami? Protams, jautājums, vai tas ir vajadzīgs. Bet kāpēc bīstami?

Link to comment
Share on other sites

AndrisBB

Pa lielam jau tās HAL bibliotēkas netiek rakstītas tikai lai programmētāji varētu manuāli rakstīt kodu un lietot viņas. Tapēc reizēm varbūt tas kods var likties dīvains.

Realitāte ir tāda ka tas kkods tiek rakstīts, lai varētu izmantot uz 1000 un 1 dažāda MCU, lai varētu automātiski ģenerēt no vosādiem tūļiem, izmantot visādas testu bibliotēkas, viegli integrēt kautkādos OS. Kas ir īstenībā būtiski, jo nav jēgas no HAL bibliotēkas ja viņu viegli nevar ieintegrēt kādā RTOS.

Link to comment
Share on other sites

Jurkins
(labots)

Nu jā, neesmu sevi piespiedis apgūt kādu RTOS.

Kā neprofesionālis izjūtu nepatiku pret OS mikrokontrolierī.

Labots - Jurkins
Link to comment
Share on other sites

AndrisBB
Pirms 8 minūtēm , Jurkins teica:

Var par šo konkrētāk? Kāpēc bīstami?

Viss jau atkarīgs no konkrētās applikācijas. STL izmanto heapu un dinamosko atmiņas izdalīšanu. Esi pārliecināts ka agrāk vai vēlāk neiebrauksi kautkādās divainās atmiņas fragmentācijas problēmās?

 

Pirms 4 minūtēm , Jurkins teica:

Nu jā, neesmu sevi piespiedis apgūt kādu RTOS.

Zephyr nav ne vainas.

https://www.zephyrproject.org/

Link to comment
Share on other sites

Jurkins
Just now, AndrisBB teica:

atmiņas fragmentācijas problēmās?

Mož tupiju... ne jau visas std/stl funkcijas izmanto Tevis minētās lietas. Kāda starpība bīstamībai, vai tas notiek uz avr, arm vai x86-64. Tad jau tajās problēmās var iebraukt uz jebkuras arhitektūras.

 

Link to comment
Share on other sites

AndrisBB

Nu ja tu paņem kautkādu ARM Cortex ar teiksim 100kb brīvu atmiņu iedalītu heapam. Tad randomā malloco un atbrīvo kautkādus objektus izmēros teiksim 200b līdz 2kb. Cik daudz laika vajadzēs, līdz tu vairs nevarēsi izveidot jaunus 2kb objektus, jo nebūs vairs 'spraugas', kur viņu iespraust? Kautgan lielākā daļa atmiņas ir itkā brīva.

x86 un resnākiem ARM pavisam cits stāsts, tur ir bezgalīga virtuālā atmiņa un MMU.

Labots - AndrisBB
Link to comment
Share on other sites

Jurkins

Mana savārstījuma 😁 gadījumā vispār nekādi objekti netiek veidoti. Pat speciāli no tā notiek intensīva atkratīšanās.

Link to comment
Share on other sites

Jurkins
(labots)

Nu tas laikam šoreiz nebūs. Reāli kods nekur tālāk par reģistriem neiet. Nekādi malloc un new vispār nav paredzēti. Doma tāda, ka maksimāli viss iespējamais notike compile time.

 

p.s. arduino ir šausmīgs savā būtībā 😁

Labots - Jurkins
Link to comment
Share on other sites

  • 4 weeks later...
Jurkins

Tā... nu laikam jau tupīju. Bet nesaprotu kur.

Reku jūtūbes lekcija

25:10

nestrādā tās funkcijas. Šamās nemaz nav jākompilē. Tas viss ir kompile taime. Rāda kļūdu uzreiz.

image.thumb.png.523409005e217fd5635bee68b3df7a92.png

Varbūt problēma, ka uz win pēdējais gcc ir 10.3, bet aktuālais ir 11.* Mož kāds uz pingvīna var nočekot?

Link to comment
Share on other sites

Jurkins

Tas nebūs tas, man šķiet. Šīs nav std::ranges::... funkcijas.

Te tēma ir par to, ko Aleksandresku kādreiz darīja ar loki.h bibleni ar klasēm/struktūrām, tagad var darīt ar funkcijām.

 

Link to comment
Share on other sites

Jurkins

Tās no video tikai nosaukumi sakrīt ar std:: funkcijām

template<class F, class ... Ts>
constexpr bool all_of(F f, type_pack<Ts...>)
{
    return (... && f(just_type<Ts>{}));
}

šim būtu jāatgriež true:

constexpr auto res = all_of<std::is_pointer>(type_pack<uint16_t*, uint8_t*, uint32_t*>{});

 

Link to comment
Share on other sites

AndrisBB

Tad kam tev tādas, ja tās nav std: funkcijas?

Ja jau nav, tad attiecīgi linko iekšā bibliotēku no kurienes viņas nāk.

Link to comment
Share on other sites

Jurkins

Tā nav bibliotēka. Vienkāršas "ar roku" uzrakstītas funkcijas speciāli compile time operācijām.

Manā iepriekšējā postā - funkcija all_of pārbauda, vai visiem tipiem, kas iepakoti iekš "type_pack" (jo tikai tā tipus var iedot funkcijai kā parametrus) izpildās attiecīgā funkcija.

Viss iepriekšējais no tās lekcijas man strādā, bet šajā vietā sāk mest kļūdu.

p.s. tīri akadēmiska interese. Ar šitām izvirtībām varētu skaistāk (un drošāk) uzrakstīt to, kas man strādā.

Link to comment
Share on other sites

AndrisBB

Ja gribi čakarēt sev smadzenes, nevis rakstit kodu, tad ņem Rust. Gan labāks, gan drošāks, gan savā ziņā glītāks kods sanāks.

Īstenībā uz MCU pat Rust būs piemērotāks nekā C++ ar saviem templeitiem. 

Link to comment
Share on other sites

Jurkins

OK, paskatīšos to Rust, esmu tikai dzirdējis, ka tāds ir. Bet pačakarēt smadzenes man patīk 😁.

 

Bet to figņu atrisināju. Nezinu, kas tam čalim par kompilatoru, bet tā, kā viņam ir, tam vispār nevajadzētu strādāt. Kompilators nevar (kā iztulkot pareizi?) couldn't deduce template parameter). Dabūju mingw 12.1 ar C++23, tāpat neprot.

Ja funkciju ieliek lambdā, tad strādā.

 

template<class F, class ... Ts>
constexpr bool all_of(F f, type_pack<Ts...>)
{
    return (... && f(just_type<Ts>{}));
}

 

static_assert(all_of([](auto v){return std::is_pointer_v<typename decltype(v)::type>;}, type_pack<uint16_t*, uint16_t*>{}));

 

Link to comment
Share on other sites

AndrisBB

Ganjau kautkas llvm bāzēts.

Man liekas ka vairāk var iemācīties kautko reāli praktisku taisot, nekā burties cauri kautkādiem teorētiskiem variantiem kam visai apšāubāmi pielietojumi dzīvē.

Link to comment
Share on other sites

AndrisBB

Lielākoties jau C++ priekš 'software engineering' un 'embedded system' īpaši nepārklājas.

Pēc pielietojuma industrijā var teikt ka tās ir divas dažādas pasaules.

 

 

Screenshot 2022-06-07 at 19.56.46.png

Link to comment
Share on other sites

Jurkins
Pirms 16 minūtēm , AndrisBB teica:

var iemācīties kautko reāli praktisku taisot,

Jā, nu man nezin vai šī mācīšanās noderēs naudas pelnīšanā. Un es šo konkrēti izmantoju darbojoties ar mcu reģistriem. No loģiskā saprāta viedokļa gan jau 50+ pilnīga bezjēga 😁, bet man patīk.

 

Link to comment
Share on other sites

AndrisBB

Var jau viskautko samācīties, pielietot visādas nišas fīčas, bet tad kad jāsāk taisīt kautkas praktisks, tad nākas pielietot dažņedažādas bilbliotēkas, ar kurām tas viss vienkārši nedarbisies, katra savā stilā, kautkā mēģināt savilkt to visu kopā. Pa vidam protams citi kolēģi ar savām idejām kā jāraksta kods :D

 

Link to comment
Share on other sites

Jurkins

@AndrisBB, nestrīdos 😉. Tu to noteikti zini daudz, daudz labāk. Bet es neesmu izstrādātāju komandā, man nav kolēģu, ar ko kašķēties 😁.

Link to comment
Share on other sites

Izveido kontu, vai pieraksties esošajā, lai komentētu

Jums ir jābūt šī foruma biedram, lai varētu komentēt tēmas

Izveidot jaunu kontu

Piereģistrējies un izveido jaunu kontu, tas būs viegli!

Reģistrēt jaunu kontu

Pierakstīties

Jums jau ir konts? Pierakstieties tajā šeit!

Pierakstīties tagad!
 Share

×
×
  • Izveidot jaunu...