-
Notifications
You must be signed in to change notification settings - Fork 132
/
Copy pathEmbeddedLinux-OzetNotlar-Ornekler.txt
12653 lines (9557 loc) · 850 KB
/
EmbeddedLinux-OzetNotlar-Ornekler.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
/*-----------------------------------------------------------------------------------------------------------------------------
C ve Sistem Programcıları Derneği
Gömülü Linux Sistemleri - Geliştirme ve Uygulama Kursu
Sınıfta Yapılan Örnekler ve Özet Notlar
Eğitmen: Kaan ASLAN
Bu notlar Kaan ASLAN tarafından oluşturulmuştur. Kaynak belirtmek koşulu ile her türlü alıntı yapılabilir.
(Notları sabit genişlikli font kullanan programlama editörleri ile açınız.)
(Editörünüzün "Line Wrapping" özelliğini pasif hale getiriniz.)
Son Güncelleme: 25/02/2025 - Salı
-----------------------------------------------------------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------------------------------------------------------
1. Ders 24/10/2024 - Perşembe
-----------------------------------------------------------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------------------------------------------------------
Kurs için gerekli olabilecek malzemeler şunlardır:
- Raspberry Pi SBC (Single Board Computer): Version 3, 4 ya da 5 olabilir. Yeni satın alacakların Raspberry Pi 5 almalarını
tavsiye ediyoruz.
- Raspberry Pi 5 alınacaksa soğutucu ya da soğutuculu kılıf da alınmalı. Raspberry Pi 3 ve 4 için soğutucu alınmayabilir.
- Raspberry Pi için Micso SD Kart: 64 GB yüksek hızlı micro SD kart tavsiye ediyoruz. 32 GB de olabilir. Ancak 32 GB'den
düşüğü tavsiye etmiyoruz.
- Raspberry Pi 4 ve Raspberry Pi 5 için "Micro HDMI -> HDMI Kablosu", Raspberry Pi 3 için "HDMI -> HDMI" Kablosu.
- USB Kombo Klavye + Mouse
- Raspberry Pi için GPIO Breadboard Aktarma Kablosu
- Raspberry Pi için Güç Kaynağı Adaptörü: Raspberry Pi 3 ve 4 için 5V/3A, Raspberry Pi 5 için 5V/5A (27W). Raspberry Pi 4
ve 5 USB Type C kullanıyor. Raspberry Pi 3 Micro USB kablosu kullanıyor.
- BeagleBone Black SBC (Single Board Computer): Yeni satın alacak olanlar "BeagleBone Black 4G" ya da BeagleBone Black Wireless"
alabilirler. Stokları kontrol etmek gerekiyor.
- BeagleBone Black için Güç Kaynağı: Mini USB ile 5V/500mA güç adaptörü ya da yuvarlak girişli (DC Jack) 5V/1A güç adaptörü.
Ancak BeagleBone Black USB kablo ile PC’den de güç alabilmektedir.
- BeagleBone Black için Micro SD Kart (16GB olabilir).
- BeagleBone Black için "Micro HDMI -> HDMI" Dönüştürücü.
- Standart Boy Breadboard ve İsteğe Bağlı Küçük Boy Breadboard'lar da olabilir.
- Jumper Kablo seti
- "USB -> UART" Dönüştürücü (CP2102 çevirici modül olabilir)
- USB Uzatma Kablosu Gerekebilir.
- Ethernet RJ45 Kablosu: Eğer SBC'nin wireless özelliği varsa buna gerek duymayabilirsiniz.
-----------------------------------------------------------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------------------------------------------------------
2. Ders 07/03/2024 - Perşembe
-----------------------------------------------------------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------------------------------------------------------
Kursumuzun giriş bölümünde çeşitli kavramları ve terimleri açıklayacağız.
-----------------------------------------------------------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------------------------------------------------------
Asıl amacı bilgisayar olmayan fakat bilgisayar devresi içeren sistemlere genel olarak gömülü sistemler (embedded systems)
denilmektedir. Yani gömülü sistemler başka amaçları gerçekleştirmek için tasarlanmış olan aygıtların içerisindeki bilgisayar
sistemleridir. Örneğin elektronik tartılar, biyomedikal aygıtlar, GPS cihazları, turnike geçiş sistemleri (validatörler),
müzik kutuları, kapı güvenlik aygıtları, otomobiller içerisindeki kontrol panelleri birer gömülü sistemdir. Gömülü
sistemlerde en çok kullanılan programlama dili C'dir. Ancak genel amaçlı işletim sistemlerinin yüklenebildiği SBC'lerde
(Single Board Computer) diğer programlama dilleri de kullanılabilmektedir.
Gömülü sistemler gömüldüğü aygıtta belli işlevleri sağlamak için kullanılmaktadır. Örneğin buzdolaplarının, çamaşır
makinelerinin içerisine yerleştirilen bilgisayar devreleri ve yazılımlar onların önemli etkinlerini yönetmekte, kullanıcı
ile arayüz oluşturabilmektedir. Günümüzde bilgisayar sistemi içeren aygıtlar artık her yeri sarmıştır. Bu nedenle gömülü
sistemler üzerinde geliştirme faaliyetleri de önemli bir iş alanı haline gelmiştir.
Gömülü sistemlerin tipik özellikleri şunlardır:
- Gömülü sistemler "genel değil belirli (specific) amaca yönelik" işlemleri gerçekleştirmektedir. Yani genel amaçlı değil,
özel amaçlı donanım ve yazılım hizmeti sunmaktadır. Bu sistemlerdeki yazılımlar da genel amaçlı değil, belli bir amacı
gerçekleştirmeyi hedeflemektedir.
- Gömülü sistemler genellikle daha düşük bir bilgi işlem kapasitesine sahip bilgisayar devreleridir. Örneğin bu sistemlerde
kullanılan işlemciler genel amaçlı masaüstü işlemcilerden genellikle daha yavaş olma eğilimindedir. Bu sistemlerdeki bellek
miktarları (birincil ve ikinci bellekler) genel amaçlı bilgisayar sistemlerine göre daha düşük olma eğilimindedir. Dolayısıyla
gömülü sistemlerin maliyetleri de genel amaçlı bilgisayar sistemlerine göre oldukça düşüktür.
- Gömülü sistemler genellikle (fakat her zaman değil) daha düşük güç harcamaktadır. Bu durum onların bataryalarla beslenebilmesini
dolayısıyla fiziksel taşınabilirliğini de artırmaktadır. Tabii genel olarak gömülü sistemler düşük güç harcama eğiliminde olan
sistemler olsalar da bu durum her zaman böyle olmak zorunda değildir. Bazı gömülü sistemlerin gömüldüğü sistemlerde bir güç
kullanma sorunu yoktur. (Örneğin araba kantarı zaten bu işlevi gerçekleştirmek için önemli bir güç harcamaktadır. Dolayısıyla
bu sistemdeki gömülü sistemin harcadığı gücün önemi olmayabilir.)
- Gömülü sistemlerin önemli bir bölümü "gerçek zamanlı (real time)" olaylarla ilişkilidir. Bu sistemlerin belli bir bölümü
dış dünyadaki değişimlere karşı bir yanıt oluşturmaya çalışmaktadır. Örneğin bir gömülü sistem otamdaki ısı belli bir kritik
düzeye geldiğinde bir işlemi başlatabilir. Ya da bir gömülü sistem kalp ritmi bozulduğunda kalbe uyarılar göndererek ritim
bozukluğunu düzeltmeye çalışabilir. Hava araçlarındaki gömülü sistemler o anki hava şartlarına göre bir otomatik kumanda sistemi
işlevini görüyor olabilir. Tabii gömülü sistemlerin bu gerçek zamanlı işlem doğası bazı uygulamalarda "çok katı (hard realtime)"
olurken bazı uygulamalarda "daha gevşek (soft realtime)" olabilmektedir.
- Gömülü sistemlerin bazılarında hiç girdi/çıktı birimi olmayabilir. Bazılarında ise girdi/çıktı birimi olarak "düğmeler",
basit tuş takımları, küçük LCD'ler olabilir. Oysa genel amaçlı bilgisayar sistemlerinde genellikle girdi/çıktı birimi olarak
klavye, fare ve gelişmiş monitörler kullanılmaktadır. Başka bir deyişle gömülü sistemler kullanıcı arayüzü bakımından minimal
olma eğilimindedir.
- Gömülü sistemlerdeki donanım birimleri nispeten ucuz olma eğilimindedir. Genel amaçlı bilgisayarlara göre bunlar çok daha ucuz
olarak temin edilebilmektedir.
Gömülü sistemler “işlevsel gereksinimlere göre” ve “performans gereksinimlerine” göre de sınıflandırılabilmektedir:
1) İşlevsel Gereksinimlere Göre Sınıflandırma:
a) Gerçek Zamanlı Olan ya da Gerçek Zamanlı Olmayan Gömülü Sistemler: Bunlar "hard" ya da "soft" real-time olabilmektedir.
b) Bağımsız (Stand-alone) Olan ya da Bağımsız Olmayan Sistemler
Örneğin hesap makineleri, kapı güvenlik sistemleri, MP3 çalarlar gibi.
c) Ağ (Network) Üzerinde İşlem Yapan Gömülü Sistemler: Bunlar ağ işlemleri yapmak için oluşturulmuş gömülü sistemlerdir.
ATM makinelerini, ADSL Router gibi aygıtları bunlara örnek verebiliriz.
d) Mobil Aygıtlarda Kullanılan Gömülü Sistemler: Bunlar küçük, taşınabilir aygıtlarda kullanılan gömülü sistemlerdir.
Telefonlar, GPS cihazları, dijital kameralar bunlara örnek verilebilir.
2) Performans Gereksinimlerine Göre Sınıflandırma:
a) Küçük Ölçekli (Small Scale) Gömülü Sistemler
b) Orta Ölçekli (Medium Scale) Gömülü Sistemler
c) Büyük Ölçekli (Large Scale) Gömülü Sistemler
Biz burada "https://www.ultralibrarian.com/2022/06/28/types-of-embedded-systems-characteristics-classifications-ulc"
bağlantısındaki sınıflandırmayı kullandık. Ancak başka kaynaklarda başka türlü sınıflandırmalar da yapılabilmektedir.
Gömülü sistemlerde bilgisayar birimi olarak genellikle mikrodenetleyiciler (microcontrollers) kullanılmaktadır. Ancak entegre
devre teknolojisinin gelişmesiyle artık içlerine standart işletim sistemi yüklenebilen çok daha gelişmiş donanımlar da
gömülü sistemlerde kullanılabilmektedir.
Gömülü sistem yazılımlarının önemli bir bölümü bir işletim sistemi olmadan çalışacak biçimde (bare-metal) olarak geliştirilmektedir.
Bunun önemli nedenlerinden biri bunların kapasitelerinin nispeten düşük olması diğeri de belirli bir amacı gerçekleştirecek
biçimde tasarlanmış olmalarıdır. Gömülü sistemlerin bir bölümünde "gerçek zamanlı işletim sistemleri" bir bölümünde ise "genel
amaçlı işletim sistemleri" kullanılmaktadır.
Gömülü sistemlerde genel olarak üç işlem birimi kullanılmaktadır:
1) Mikrodenetleyiciler
2) Mikroişlemciler
3) DSP'ler
-----------------------------------------------------------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------------------------------------------------------
Bir bilgisayar sisteminde aritmetik, mantıksal, bitsel işlemler ve karşılaştırma gibi bilgi işlem faaliyetleri işlemleri
"mikroişlemci (microprocessor)" denilen birim tarafından yapılmaktadır. Mikroişlemciler entegre devre biçiminde üretilmişlerdir.
Mikroişlemcilere kavramsal olarak CPU (Centeral Processing Unit) de denilmektedir. Aslında genel amaçlı bir bilgisayar sisteminde
komut çalıştıran pek çok işlemci bulunabilmektedir. CPU bu işlemcileri de programlayan "merkezi (central)" işlemcidir. Bilgisayar
sisteminde yerel bazı işlemlerden sorumlu yardımcı işlemciler de vardır. Örneğin "kesme denetleyicisi (interrupt controller)",
"disk denetleyicisi (disk controller)", "DMA denetleyicisi (DMA controller)" gibi.
-----------------------------------------------------------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------------------------------------------------------
Mikrodenetleyiciler tek bir chip içerisine yerleştirilmiş bir bilgisayar sistemi gibi düşünülebilirler. Tipik olarak bir
mikrodenetleyicide bir "işlemci (processor)", kendi içerisinde "RAM ve Flash EPROM", dış dünya ile haberleşmek için kullanılan
"Giriş/Çıkış (IO) birimleri" ve bazı "çevre birimleri (peripherals)" bulunmaktadır. Mikrodenetleyicilere İngilizce "Microcontroller"
ya da "Microcontroller Unit (MCU)" da denilmektedir.
Mikrodenetleyicilerin işlem kapasiteleri ve içerdikleri bellek miktarları düşük olma eğilimindedir. Ancak bunlar çok kolay
programlanıp uygulamaya sokulabilmektedir. Mikrodenetleyicilere "tek çiplik bilgisayar (single chip computer)" da denilmektedir.
Mikrodenetleyiciler özellikle gömülü sistemlerde tercih edilmektedir. Bunların düşük güç harcaması ve ucuz olmaları en büyük
avantajlarındandır. Gömülü uygulamalarda kullanılan pek çok mikrodenetleyici ailesi vardır. Örneğin:
- Microchip PIC Mikrodenetleyici Ailesi (Microchip)
- Renesas Mikrodenetleyici Ailesi (Renesas)
- ARM Mikrodenetleyici Ailesi (Tasarımcısı ARM Holding, ancak çok çeşitli firmalar tarafından üretiliyor)
- AVR Mikrodenetleyici Ailesi (Atmel, ancak Atmel firması 2016'da Microchip tarafından satın alındı)
- MSP Mikrodenetleyici Ailesi (Texas Instruments)
-----------------------------------------------------------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------------------------------------------------------
Bazı firmalar ayrı birimler olarak tasarlanmış mikroişlemcileri, RAM'leri, ROM’ları ve diğer bazı çevre birimlerini tek bir
entegre devrenin içerisine sıkıştırmaktadır. Bunlara genel olarak "SoC (System on Chip)" denilmektedir. SoC mikrodenetleyicilere
benzese de aslında onlardan farklıdır. SoC’lar içerisindeki işlemcilerin ve belleklerin kapasiteleri yüksektir. Bunlar özel
amaçlı üretilirler ve bunların devrelerde kullanılmaları mikrodenetleyiciler kadar kolay değildir. Bunların en önemli avantajları
az yer kaplamasıdır. Örneğin Raspberry Pi kitlerinde Broadcom isimli firmanın 2835, 2836, 2837, 2711, 2712 numaralı SoC
çipleri kullanılmıştır. SoC'ların RAM ve ROM bellek içermesi zorunlu değildir. Bazı SoC'lar RAM içerirken bazıları içermeyebilmektedir.
Örneğin Raspberry Pi 1, 2, 3 modellerinde kullanılan SoC'lar RAM içerirken Raspberry Pi 4 ve 5 modellerinde kullanılan SoC'lar
RAM içermemektedir.
-----------------------------------------------------------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------------------------------------------------------
SoC kavramına benzer diğer bir kavram da "SoM (System on Module)" kavramıdır. SoM bir işlemci ve onunla ilişkili bazı birimlerin
monte edildiği kartları belirtmek için kullanılmaktadır. SoM'lar SoC'ları içerebilir. Ancak başka birimleri de içerebilir.
Örneğin bir SoM bir işlemci, buna ilişkin RAM, IO denetleyicisi (IO controllers) içeren bir kart olabilir. Örneğin "Raspberry Pi
Pico" ve "Raspberry Pi Compute Module" birer SBC'den ziyade birer SoM olarak ele alınabilir. SoM kavramını zihninizde SoC ile
SBC arasında bir yerde konumlandırabilirsiniz.
-----------------------------------------------------------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------------------------------------------------------
Küçük bir kit (baskılı devre) üzerine monte edilmiş bilgisayarlara SBC (Single Board Computer) denilmektedir. Genellikle
bu kitlerde SoC'lar, RAM'ler, başka çevre birimleri ve IO işlemleri için uçlar bulunmaktadır. Örneğin Raspberry Pi’lar,
Beagleboard’lar SBC'lere örnek verilebilir. SBC'ler klavye, fare ve monitör takılarak bir masaüstü bilgisayar gibi
kullanılabilmektedir. SBC'ler masaüstü bilgisayarlar gibi de kullanılabildiğinden bunlara Linux başta olmak üzere, Android
ve Windows gibi işletim sistemleri yüklenebilmektedir.
-----------------------------------------------------------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------------------------------------------------------
Mikroişlemcileri tasarım mimarilerine göre CISC (Complex Instruction Set Computers) ve RISC (Reduced Instruction Set Computers)
olmak üzere iki kısma ayırabiliriz. CISC ailesi işlemcilere Intel firmasının x86 ailesi işlemcilerini örnek verebiliriz.
ARM, MIPS, PowerPC, Itanium gibi işlemciler ise tipik RISC işlemcileridir. Her ne kadar CISC ve RISC isimleri komut kümesi
ile ilgili biçimde uydurulmuşsa da CISC ve RISC tasarımları başka bakımlardan da farklılık göstermektedir.
Önceleri işlemcilerin (makro ve mikro) fazla sayıda makine komutuna sahip olması bir avantaj olarak görülüyordu. Ancak daha
sonraları bunun avantajdan ziyade dezavantaj oluşturduğu anlaşıldı. Belli bir süreden sonra artık RISC mimarisinin CISC
mimarisinden toplamda daha iyi bir tasarım olduğu kabul görmüştür. Bu nedenle son dönem mikroişlemci tasarımlarında hep RISC
mimarisi kullanılmıştır.
CISC ve RISC işlemci mimarisi arasındaki temel farklılıklar şunlardır:
1) CISC işlemcilerinde fazla sayıda makine komutu bulunmaktadır. Bu işlemcilerde bazı komutlar temel işlemleri yaparken
bazıları karmaşık işlemler yapmaktadır. Halbuki RISC işlemcilerinde az sayıda temel makine komutları bulunmaktadır. Bu
makine komutları da daha fazla transistör kullanılarak daha hızlı çalışacak biçime getirilmiştir. Dolayısıyla CISC işlemcilerindeki
bazı komutlar RISC işlemcilerinde birkaç komutla karşılanabilmektedir. Ancak bu durum sanıldığının tersine daha hızlı bir
çalışma sağlama potansiyelindedir.
2) CISC işlemcilerinde az sayıda yazmaç (register), RISC işlemcilerinde ise fazla sayıda yazmaç bulunma eğilimindedir. Yazmaç
sayıları az olunca yazmaçların tekrar tekrar aynı değerlerle yüklenmesi gerekebilmektedir. Bu da derleyicinin nesneleri
daha kısa sürede yazmaçlarda tutmasına yol açmaktadır. Yine CISC işlemcilerindeki bazı komutlar ancak bazı özel yazmaçlarla
kullanılmaktadır. (Örneğin Intel x86 işlemcilerinde MUL ve DIV komutlarının bir operandı EAX ya da RAX yazmacında bulunmak
zorundadır.) Oysa RISC işlemcilerinde her işlem her yazmaçla yapılabilmektedir.
3) CISC işlemcilerinde komutlar farklı uzunluklarda olabilmektedir. Örneğin Intel'in x86 ailesinde 1 byte olan makine komutları
da vardır, 5 byte olan makine komutları da vardır, 11 byte olan hatta 15 byte olan makine komutları da vardır. Halbuki RISC
işlemcilerinde genel olarak tüm makine komutları eşit uzunluktadır. Örneğin ARM işlemcilerinde her makine komutu 4 byte
uzunluktadır. Böylece işlemci komutları bellekten daha etkin bir biçimde çekip (fetch işlemi) onları daha çabuk anlamlandırmaktadır.
Belli bir sayı sonraki ya da önceki makine komutlarının yerini belirleyebilmektedir.
4) RISC işlemcilerinde pipeline mekanizması CISC işlemcilerine göre daha iyi gerçekleştirilmektedir. Pipeline işlemcinin
bir makine komutunu çalıştırırken sonraki komutlar üzerinde hazırlık işlemlerini yapması anlamına gelmektedir. RISC tasarımı
olarak pipeline mekanizmasının daha iyi yürütülmesine olanak sağlamaktadır.
5) RISC işlemcileri load/store tarzı makine komutları kullanmaktadır. Bu işlemcilerde belleğe erişim yapan makine komutlarıyla
aritmetik, mantıksal ve bitsel işlem yapan makine komutları birbirinden ayrılmıştır. Örneğin RISC işlemcilerinde ADD, SUB gibi
makine komutlarının her iki operandı da yazmaç olmak zorundadır. Halbuki CISC işlemcilerinde bu tür makine komutlarının bir
operandı yazmaç bir operandı bellek olabilmektedir. Örneğin:
a = b + c;
gibi bir işlem CISC işlemcisi ile şu makine komutlarıyla yapılabilmektedir:
- b'yi yazmaca çeken makine komutu
- Yazmaçtaki b ile bellekteki c'yi toplayan makine komutu
- Yazmaçtaki toplamı a'ya yerleştiren makine komutu
Oysa aynı işlem RISC işlemcilerinde şöyle gerçekleştirilmektedir:
- b'yi yazmaca çeken makine komutu
- c'yi yazmaca çeken makine komutu
- Yazmaçlardaki b ile c'yi toplayan makine komutu
- Yazmaçtaki sonucu a'ya yerleştiren makine komutu
Belleğe erişim komutlarıyla diğer komutların birbirinden ayrıldığı işlemcilere "load/store" işlemciler ya da "register-register"
işlemciler de denilmektedir.
6) RISC işlemcileri genel olarak (ancak hepsi değil) üç operandlı makine komutlarını kullanmaktadır. Oysa CISC işlemcileri
genellikle iki operand'lı makine komutlarını kullanır. İki operand'lı makine komutlarında işlemin sonucu operand olan yazmaçlardan
birine yerleştirildiği için o yazmaç bozulmaktadır. Böylece derleyici o yazmaçtaki değeri yeniden kullanmak istediğinde
onu yeniden yüklemek zorunda kalmaktadır. Örneğin a = b + c işlemi 32 bit Intel işlemcilerinde tipik olarak şöyle
gerçekleştirilmektedir:
MOV EAX, <a'nın adresi>
ADD EAX, <b'nin adrei>
MOV <c'bin adresi>, EAX
Burada EAX işlemcinin bir yazmacıdır. ADD makine komutu bu yazmaçtaki değer ile bellekteki b'yi toplamakta ve sonucu yine
EAX yazmacına yerleştirmektedir. Dolayısıyla EAX yazmacındaki a değeri artık kaybolacaktır. Bu değer yeniden kullanılmak
istendiğinde ise yeniden yüklemenin yapılması gerekecektir. Şimdi aynı işlemi ARM işlemcilerinde yapacak olalım:
LDR R0, <a'nın bellek adresi>
LDR R1, <b'nin bellek adresi>
ADD R2, R1, R0
STR R2, <c'nin bellek adresi>
Burada R0, R1 ve R2 işlemcinin yazmaçlarıdır. Görüldüğü gibi ARM işlemcilerinde load/store komutları dışındaki komutlar
üç operand'lıdır. Bu da yazmaçlardaki değerlerin gerektiğinde bozulmamasına yol açmaktadır.
7) RISC işlemcileri yukarıda belirttiğimiz tasarım prensiplerinden dolayı toplamda daha az güç harcama eğilimindedir. Bu da
onların mobil aygıtlarda kullanılmasının önemli bir gerekçesini oluşturmaktadır.
8) RISC işlemcilerinde makine komutlarının çalışma süreleri birbirine yakındır. Ancak CISC işlemcilerinde makine komutlarının
çalışma süreleri arasında önemli farklılıklar olabilmektedir. Örneğin ARM işlemcilerinde toplama, çıkartma, çarpma gibi
makine komutları 1 cycle'da yapılmaktadır. Ancak load/store komutlarının, jump komutlarının ve özel bazı komutların çalışma
süreleri 1 cycle'dan fazla olabilmektedir. Oysa örneğin Intel x86 işlemcilerinde komut süreleri değişik faktörlere bağlı olarak
birbirinden çok farklılaşmaktadır.
RISC ve CISC mimarilerini bir spektrum olarak düşünmek gerekir. Örneğin MIPS işlemcileri ARM işlemcilerine göre bu spektrumun
daha fazla RISC tarafındadır. Intel'in x86 işlemcilerini kategori olarak CISC grubu işlemciler olarak ele alsak da Pentium
işlemcileri ile birlikte bu işlemcilerde de RISC prensipleri gittikçe daha fazla kullanılır hale gelmiştir.
-----------------------------------------------------------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------------------------------------------------------
3. Ders 12/03/2024 - Salı
-----------------------------------------------------------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------------------------------------------------------
ARM işlemcilerinin tarihi "Acorn Computer" isimli İngiliz firmasına dayanmaktadır. Bu firma 80’li yılların başlarında
"BBC Micro" isimli 64K’lık ev bilgisayarlarını yapmıştı. Bu bilgisayarlarda Rockwell’in 8 bitlik 6502 işlemcileri kullanılıyordu.
Firma daha sonra "Berkeley RISC" projesinden etkilenerek kendi RISC işlemcilerini yapmaya odaklandı. Böylece ilk ARM modelleri
tasarlanmış oldu. Şirket 1990’da "Apple" ve "VLSI Technology" şirketleriyle ortaklıklar da kurarak ARM ismini aldı. (Eskiden
ARM "Acorn RISC Machine" isminden kısaltlıyordu. Fakat daha sonra bu firma kurulunca bu kısaltma "Advanced RISC Machine" haline
getirildi.) Apple firması bu yeni firmaya maddi destek sağlamıştır. "VLSI Technology" firması ise ekipman tedarik etmiştir.
Acorn ise az sayıda tasarım mühendisini bu yeni firmaya aktarmıştır. 2016 yılında "SoftBank Group" ARM hisselerinin önemli bir
bölümünü aldı. 2018'de ARM'ın Çin şubesinin yarısından fazlasını "Chine Investment" şirketine sattı. 2020'de "NVidia", ARM'ı
SoftBank Group'tan satın almak istediyse de satış gerçekleşmedi. Bugün "SoftBank Group" ARM'ın %90 civarındaki hisselerine
sahiptir. Geri kalan hisseleri kurucu ortaklarda ve halka arzdadır.
-----------------------------------------------------------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------------------------------------------------------
ARM (İngilizce'de de "ey ar em" biçiminde değil "arm" biçiminde okuyorlar) bir tasarım firmasıdır. Yani fabrikalara sahip
değildir. ARM yaptığı tasarımları lisanslandırarak üretici firmalara satmaktadır. ARM'ın uyguladığı dört tür lisans vardır:
Entegre Devre Lisansı (Full Custom License): Bu lisans müşterinin mikrodenetleyici tasarımını kendi özel ihtiyaçlarına
göre özelleştirmesine ve optimize etmesine olanak tanır. Örneğin Apple gibi, Qualcomm gibi, Samsung gibi firmalar bu
lisansa sahiptir.
Mimari Lisans (Architecture License): Bu lisans ARM'nin genel mikroişlemci mimarisine erişim sağlayan bu lisanstır. Ancak,
bu lisans müşterinin mikrodenetleyiciyi özelleştirmesine izin vermez. Yani bu lisansa sahip olanlar işlemci tasarımını
kullanarak üretim yapabilirler ancak onu özelleştiremezler.
Çekirdek Lisansı (Processor IP License): Bu lisans ile ancak müşteri belli bir ARM işlemcisini (core) üretebilmektedir.
Geliştirici Lisansı (Development License): Bu lisans ARM'nin tasarım araçlarına erişim sağlayan bir lisanstır. Müşteri
bu araçları kullanarak kendi işlemcilerini tasarlayabilir.
-----------------------------------------------------------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------------------------------------------------------
ARM dünyasında çalışmak için bazı terimler hakkında bilgi sahibi olmak gerekir. ARM firması kendine özgü terimler uydurmuştur.
Bu dünyada en çok karşılaşılan terimler "core", "cortex" ve "version" terimleridir.
ARM dünyasında "core" terimi belli bir mikroişlemci tasarımını belirtmektedir. Bu tasarım üretici firmalar tarafından
fiziksel hale getirilmektedir. Bir grup "core" bir araya getirildiğinde ve işlemciyle ilişkili birtakım birimler de bunlara
eklendiğinde "cortex'ler" oluşmaktadır. ARM firması ARM'ın klasik versiyonlarında "cortex" terimini kullanmamıştır. Cortex
terimi ARM11'den sonra kullanılmaya başlanmıştır. Bir cortex belli sayıda "core" içerebilir. Bu "core"lar noktalı sayılara
(floating point) ilişkin işlem yapan birimlere sahip olabilirler. Cortex içerisindeki core'ların belli hızları vardır. Core
ve cortex terimleri daha çok çip düzeyindeki mimariyi belirtmektedir. Cortex'lerdeki işlemcilerin (core'ların) sistem programcısını
ilgilendiren "komut kümeleri (instruction sets)" de vardır. Böylece bir grup cortex belli bir komut kümesi ile kullanılabilecek
biçimde tasarlanmıştır. Komut kümesi mimarisine "ARM Versiyonları" ya da İngilizcesiyle "ARM ISA (Instruction Set Architecture)"
denilmektedir. Biz sistem programcısı olarak elimizdeki cortex'in hangi komut kümesini kullanan ARM versiyonuna ilişkin olduğunu
bilmek durumundayız. Burada dikkat edilmesi gereken nokta "Cortex teriminin donanımsal mimariyi, versiyonun ise yazılımsal mimariyi
belirtiyor" olmasıdır. O halde gömülü sistem geliştiricisi olarak bizim ilgilendiğimiz ARM içeren kart ile ilgili şu iki özelliği
biliyor olamamız gerekir:
1) Kartımızda ARM'ın hangi cortex'i kullanılmıştır?
2) Bu cortex'in ilişkin olduğu versiyon numarası nedir?
Yukarıda da belirttiğimiz gibi farklı cortex'ler aynı versiyon numarasını kullanabilmektedir.
ARM dünyasında üç mimari profili (profile) bulunmaktadır:
1) A (Application) Profili
2) R (Realtime) Profili
3) M (Microcontroller) Profili
Bu profiller ilgili cortex'lerin hangi tür uygulamalarda ideal olarak kullanılabileceğini belirtmektedir. Profil isimleri
cortex'lerde ve versiyon numaralarında '-' karakterinden sonra A, R, M harfleriyle belirtilmektedir. Örneğin "Cortex-A8" ve
"ARMv7-A" gibi. A profilleri masasüstü işletim sistemlerinin çalıştırılabileceği, tamamen kişisel bilgisayar olarak kullanılabilecek
cortex'leri belirtmektedir. Biz kursumuzda gömülü Linux programcısı olarak bu "A" profilleriyle çalışacağız. R profilleri
"gerçek zamanlı (realtime)" uygulamalar için daha uygun olabilecek cortex'leri belirtmektedir. R profilleri ile A profilleri
birbirlerine benzemektedir. R profilleri A profillerine göre çok daha seyrek kullanılmaktadır. M profilleri ARM'ın mikrodenetleyici
olarak kullanılan cortex'lerini belirtmektedir. Bu cortex'ler Linux işletim sisteminin yüklenmesine izin vermemektedir. Bu cortex'ler
genellikle "bare-metal" programlarla ya da gerçek zamanlı işletim sistemleriyle kullanılmaktadır.
ARM'ın iki önemli versiyonu ARMv7-A ve ARMv8-A dır. ARMv7'ler 32 bitlik bir arayüz sunmaktadır. Dolayısıyla bu komut mimarisini
kullanan cortex'ler 32 bitlik işlemciler içermektedir. ARMv8-A versiyonları ise 64 bitlik arayüz sunmaktadır. Dolayısıyla bu
versiyonları kullanan cortex'ler 64 bitlik işlemcilere ilişkindir. Ancak ARM cortex'lerinin bir grubu hem 32 bit hem de 64
bit olarak kullanılabilmektedir. Bu cortex'lerdeki işlemcileri kullanan işletim sistemleri 32 bitlik ve 64 bitlik programları
zaman paylaşımlı olarak bir arada çalıştırabilmektedir.
-----------------------------------------------------------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------------------------------------------------------
Mikroişlemciler ilk çıktığında 8 bit işlemleri yapabiliyordu (örneğin 8080, 6800 gibi işlemciler). Bunlara 8 bitlik mikroişlemci
deniyordu. Sonra 16 bitlik mikroişlemciler çıktı (örneğin Intel'in 8086, 8088 işlemcileri gibi). Bunu 32 bit işlemciler izledi.
Günümüzde artık ağırlıklı olarak 64 bit işlemciler kullanılmaktadır. Pekiyi bir işlemcinin N bitlik olmasının anlamı nedir?
Bu soruya yanıt verelim:
- N bitlik bir işlemcide tek hamlede (yani tek bir makine komutuyla) N bit üzerinde işlem yapılabilmektedir. Örneğin 32 bitlik
bir mikroişlemcide tek bir makine komutu ile 32 bitlik iki sayıyı toplayıp çarpabiliriz.
- N bitlik bir mikroişlemciler genellikle (ama her zaman değil) 2^N uzunlukta bir fiziksel RAM'i adresleyebilmektedir. Örneğin
32 bitlik bir mikroişlemciye biz tipik olarak 2^32 = 4GB'lik bir RAM bağlayabiliriz. Elimizdeki RAM 64GB olsa bile 32 bit
bir mikroişlemci bu RAM'in ancak ilk 4GB'sini kullanabilmektedir. Tabii bu durum her zaman böyle değildir. Örneğin 8086
işlemcisi 16 bit olduğu halde 2^16 değil 2^20 uzunluğunda (1MB) fiziksel belleği adresleyebiliyordu. Benzer biçimde 64 bitlik
Intel ve AMD işlemcileri 2^64 değil 2^48 uzunluğundaki RAM'leri adresleyebilmektedir.
- N bitlik bir mikroişlemcide genellikle işlemci ile RAM arasında transfer N bit olarak yapılmaktadır. Örneğin 32 bitlik
bir mikroişlemcide tek bir makine komutuyla RAM'den CPU'ya 32 bitlik bir veri transfer edilebilir. Ancak bu durum her zaman
böyle değildir. örneğin 16 bitlik Intel 8086 işlemcisi bellek transferlerini 16 bit olarak yaparken 8088 işlemcisi 8 bit
yapıyordu.)
8 bitten 16 bite geçişte ve 16 bitten 32 bite geçişte çok fark edilir bir hızlanma yaşanmıştır. Ancak 32 bitten 64 bite
geçişte hızlanma öncekiler kadar olmamıştır. Bunun nedeni 64 bitlik işlemlerin aslında yoğun olarak yapılmadığındandır. Ancak
32 bitten 64 bite geçişin en önemli etkisi işlemciye bağlanabilecek RAM miktarı üzerinde olmuştur. Örneğin elimizde 8GB
RAM'li Raspberry Pi 5 olsun. Buradaki ARM cortex'i hem 32 bit hem de 64 bit işlemci gibi çalışabilmektedir. Dolayısıyla biz
bu kartımıza 32 bitlik de 64 bitlik de Linux yükleyebilriz. Ancak 32 bitlik Linux işletim sistemi işlemciyi 32 bit modda
çalıştıracağı için işletim sistemi 8GB RAM'in ancak 4GB'sini kullanabilecektir. Bu 8GB RAM'in tamamından istifade edebilmemiz
için işlemcinin 64 bit modunda çalıştırılması dolayısıyla da işletim sisteminin 64 bit olması gerekecektir.
Pekiyi 128 bitlik işlemciler tasarlansa, bunlar daha hızlı bir çalışma sunmaz mı? Neden 128 bitlik işlemciler tasarlanmıyor?
İşte 128 bitlik tamsayı işlemlerine çok nadir gereksinim duyulmaktadır. 2^128 uzunluğunda RAM zaten şu an için erişilmesi
imkansız bir RAM miktarıdır. O halde işlemcilerin 64 bitten 128 bite çıkartılmasının şu an için önemli bir faydası olmayacaktır.
Ancak tabii gelecekte böyle bir ihtiyaç ortaya çıkabilecektir.
-----------------------------------------------------------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------------------------------------------------------
Popüler ürünlerde kullanılan ARM cortex'leri şunlardır:
iPhone 14: Apple'ın A15 isimli SoC'unu kullanmaktadır. Bu SoC'un içerisinde Apple'ın ARMv8.6‑A versiyonunu kullanan Avalanche
Cortex'i vardır. Buradaki core'lar yalnızca 64 biti desteklemektedir.
iPhone 15: Apple'ın A16 isimli SoC'unu kullanmaktadır. Bu SoC'un içerisinde Apple'ın ARMv8.6‑A versiyonunu kullanan Everest
Cortex'i vardır. Buradaki core'lar yalnızca 64 biti desteklemektedir.
Apple M1 SoC: Apple'ın ARMv8.4‑A versiyonunu kullanan FireStorm isimli Cortex'i vardır. Buradaki core'lar yalnızca 64 biti
desteklemektedir.
Apple M2 SoC: Apple'ın ARMv8.6‑A versiyonunu kullanan Avalanche ve Blizzard isimli Cortex'leri vardır. Buradaki Core'lar
yalnızca 64 biti desteklemektedir.
Apple M3 SoC: Apple'ın ARMv8.6‑A versiyonunu kullanan Avalanche ve Blizzard isimli Cortex'leri vardır. Buradaki core'lar
yalnızca 64 biti desteklemektedir.
Samsung Galaxy S24: Qualcomm firmasının Snapdragon-8 SoC'unu kullanmaktadır. Bu SoC içerisinde ARMv9-A versiyonunu kullanan
Cortex A715 bulunmaktadır.
Redmi Note 11: Xiaomi firmasının ürünüdür. Qualcomm Snapdragon-685 SoC'unu kullanmaktadır. Bu SoC'un içerisinde ARMv8.2-A
versiyonuna ilişkin Cortex A78 bulunmaktadır.
-----------------------------------------------------------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------------------------------------------------------
Bu kursta kullanacağımız SBC'lerin üzerinde bulunan ARM cortex'leri ve bunların versiyon numaraları da şöyledir:
Raspberry Pi 3: BCM2837 SoC'u kullanılmıştır. Bu SoC'un içerisinde ARMv8-A versiyonuna ilişkin Cortex-A53 bulunmaktadır. Bu
cortex'teki işlemciler hem 32 bit hem de 64 bit modda çalışabilmektedir. Dolayısıyla bunlara 32 bit ve 64 bit Linux sistemleri
yüklenebilmektedir.
Raspberry Pi 4: BCM2711 SoC kullanılmıştır. Bu SoC'un içerisinde ARMv8-A versiyonuna ilişkin Cortex-A72 bulunmaktadır. Bu
cortex'teki işlemciler hem 32 bit hem de 64 bit modda çalışabilmektedir. Dolayısıyla bunlara 32 bit ve 64 bit Linux sistemleri
yüklenebilmektedir.
Raspberry Pi 5: BCM2712 Bu SoC'un içerisinde ARMv8.2-A versiyonuna ilişkin Cortex-A76 bulunmaktadır. Bu cortex'teki
işlemciler hem 32 bit hem de 64 bit modda çalışabilmektedir. Dolayısıyla bunlara 32 bit ve 64 bit Linux sistemleri
yüklenebilmektedir.
BeagleBone Black 4G ve BeagleBone Black Wireless: Texas Instruments firmasının Sitara-AM3358 SoC'unu kullanmaktadır. Bu SoC'un
içerisinde Cortex-A8 kullanılmıştır. Bu cortex 32 bit işlemcilerden oluşmaktadır. Bunların kullandığı komut mimarisi de
ARMv7-A'dır. BeagleBone Black'ler 32 bit ARM işlemcilerini kullandığı için bunlara yalnızca 32 bit Linux sistemleri
yüklenebilmektedir.
-----------------------------------------------------------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------------------------------------------------------
4. Ders 14/03/2024 - Perşembe
-----------------------------------------------------------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------------------------------------------------------
Şimdi de Raspberry Pi 5 donanımını inceleyelim. Kartın üzerinde BCM2712 SoC'u hemen dikkati çekmektedir. Bu SoC'un hemen
yanında RAM chip'i bulunmaktadır. Raspberyy Pi 5'in 1GB, 2GB, 4GB ve 8GB RAM'li modelleri vardır. Raspberry Pi 5 modelinde
toplam 4 USB soketi bulunmaktadır. Bunlardan iki tanesi USB 2.0, diğer 2 tanesi de USB 3.0'dır. Klavye ve fare gibi
yavaş aygıtları USB 2.0 girişlerine bağlayabilirsiniz. Bunların hemen yanında Ethernet girişi, kenarlarda toplam 40 tane
(20'lik iki sıra) GPIO uçları bulunmaktadır. Bu GPIO uçları aygıtın dış dünya ile elektriksel olarak haberleşmesi için
kullanılmaktadır. Raspberry Pi 5'te iki micro HDMI girişi bulunmaktadır. Bu uçlardan birine monitörümüzü bağlayabiliriz.
Raspberry Pi 5 modelinde arka tarafta SD kart girişine yakın bir bölgede çok küçük ON/OFF düğmesi bulunmaktadır. Bu düğme
bilgisayarlarımızdaki "Power Off" düğmesi gibidir. Ayrıca kamera ve LCD bağlamak için iki adet MIP DSI/CSI ve kartın arka
tarafında da bir micro SD kart girişi bulunmaktadır. Buraya disk görevini görecek olan micro SD kart takılmaktadır. Giriş
kısmında da belirttiğimiz gibi kursun yapıldığı zaman diliminde 64GB'lik SD kartlar fiyat bakımından uygun bir büyüklüktür.
Ancak denemeler için birden fazla SD kart (bunlar daha küçük de olabilir) kullanabilirsiniz. Kart üzerindeki diğer bileşenlerin
bazılarını ilerleyen bölümlerde ayrıca ele alacağız.
Kart üzerindeki bileşenleri inceleyebilmek için aşağıdaki bağlantıyı kullanabilirsiniz:
https://grobotronics.com/raspberry-pi-5-4gb.html
Raspberry Pi'ın resmi iki sitesi raspberrypi.com ve raspberrypi.org siteleridir. Raspberry Pi ile ilgili tüm dokümanlar
https://www.raspberrypi.com/documentation/ bağlantısından elde edilebilir.
-----------------------------------------------------------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------------------------------------------------------
Raspberry Pi bir proje olarak özellikle az gelişmiş ülkelerde düşük fiyatlı bilgisayar oluşturmayı hedeflemiştir. Dolayısıyla
biz Raspberry Pi'ı tamamen Linux tabanlı bir kişisel bilgisayar olarak kullanabiliriz. Kursumuzda önce Raspberry Pi'ın
kişisel bilgisayar olarak nasıl kullanıldığı üzerinde duracağız.
-----------------------------------------------------------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------------------------------------------------------
Raspberry Pi için birkaç işletim sistemi oluşturulmuştur. Ancak bunlardan en yaygın kullanılan ikisi Linux'un "Raspberry Pi
OS (eski ismiyle Raspbian)" ve "Ubuntu" dağıtımlarıdır. Raspberry Pi ile tam uyum içinde olan ana dağıtım "Raspberry Pi OS"
dağıtımıdır. Biz sizlerinde de "Raspberry Pi OS" ve "Ubuntu" dağıtımlarını ayrı micro SD kartlara yüklemenizi tavsiye ediyoruz.
Bir bilgisayar sistemini reset ettiğimizde işletim sisteminin (ya da bu görevdeki yazılımın) yüklenmesini sağlayan yazılımlara
"boot loader" denilmektedir. Gömülü sistemlerde kullanılan "boot loader" yazılımları kursumuzun ayrı bir konusunu oluşturmaktadır.
Ancak kabaca boot işlemi şöyle gerçekleşmektedir: Biz mikroişlemciyi reset ettiğimizde çalışma belli bir adresten başlatılmaktadır.
Yani işlemci reset edildiğinde çalıştırılacak kodun önceden hazır bir biçimde kalıcı bir bellekte (bugün bunlar için flash
EPROM'lar kullanılmaktadır) bulunuyor olması gerekir. Buradaki kod çeşitli donanım birimlerini programlar ve onları kullanıma
hazır hale getirir. Sonra boot loader'ın işletim sisteminin yüklenmesinden sorumlu olan kısmı RAM'e yüklenir. Boot loader'ın
bu kısmı işletim sistemini yükler. Zaten bu konular ileride ayrıntılarıyla ele alınacaktır. Bizim bu aşamada bilmemiz gereken
şey işletim sistemimizin micro SD karta nasıl yükleneceğidir. Çünkü bu işlem yapıldıktan sonra artık her şey otomatik
gerçekleşmektedir.
-----------------------------------------------------------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------------------------------------------------------
Micro SD kartımıza işletim sisteminin yüklenmesi gelişi güzel yapılacak bir işlem değildir. Çünkü belli programların disk
üzerinde belli sektörlerde bulunuyor olması gerekmektedir. Bunu sağlamanın basit bir yolu önceden hazırlanmış bir imaj dosyasını
micro SD kartımıza aktarmaktır. Raspberry Pi için bu imaj dosyaları hazır bir biçimde zaten bulunmaktadır. O halde bizim
tek yapacağımız şey bu imaj dosyalarını indirip micro SD kartımızın içerisine aktarmaktır. Ancak son birkaç yıldır bu işlemin
kolaylaştırılması için Raspberry Pi ekibi "Raspberry Pi Imager" denilen bir program geliştirmiştir. Bu program menüler
eşliğinde kullanıcının istediği işletim sisteminin imaj dosyasını indirip micro SD karta bunları yazmaktadır. Dolayısıyla
bu program işimizi hepten kolaylaştırmaktadır. Raspberry Pi Imager programını aşağıdaki bağlantıdan indirebilirsiniz:
https://www.raspberrypi.com/software/
Raspberry Pi Imager programı indirilip kurulup çalıştırılınca program bize üç şey sormaktadır?
1) Hangi Rasperry Pi modelini kullandığımızı
2) Hangi işletim sistemini yükleyeceğimizi
3) Hangi micro SD karta yüklemeyi yapacağımızı
Bu sorulara yanıt verdikten sonra yüklenecek Linux üzerinde bazı basit konfigürasyon işlemleri de "Edit Setting" seçeneği ile
yapılabilmektedir. Tabii bunları yükleme işleminden sonra da yapabiliriz.
Raspberry Pi Imager her şeyi kendisi yapmaktadır. Program önce ilgili imajı yerel makineye indirir, sonra da micro SD karta
yazma yapar.
Tabii biz Raspberry Pi Imager programını kullanmak zorunda değiliz. Zaten bu program eskiden yoktu. Eğer bu programı kullanmayacaksak
işletim sistminin SD kart imajını indirip SD karta yazma yapan bir programla onu karta aktarmamız gerekir. SD karta aktarma
yapan pek çok bedava program vardır. Bunlardan en popüler iki tanesi "Rufus" ve "Etcher" programlarıdır. Manuel kurulum
için işletim sistemi imajlarını aşağıdaki bağlantıdan indirebilirsiniz:
https://www.raspberrypi.com/software/operating-systems/
Artık her şey hazırdır. Bundan sonra şu bağlantıları yapmalısınız:
1) SD kartınızı Raspberry Pi'ınıza yerleştiriniz.
2) Monitörünüzü Raspberry Pi'ınızın micro HDMI soketine takınız.
3) Klavye ve farenizi Raspberry Pi'ınızın USB soketlerine takınız.
4) USB Type-C soketi ile Raspberry Pi'ınıza güç veriniz.
-----------------------------------------------------------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------------------------------------------------------
5. Ders 19/03/2024 - Salı
-----------------------------------------------------------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------------------------------------------------------
Gömülü sistemimize Linux'u kurduktan sonra ona başka bir makineden erişmek isteyebiliriz. Bunun çeşitli yolları varsa da
en çok kullanılan yöntemler şunlardır:
1) SSH protokolü ile erişim
2) VNC protokolü ile erişim
3) Microsoft RDP protokolü (Remote Desktop Protocol) ile erişim
VNC ve RDP ile gömülü aygıtımızdaki Linux'a erişebilmemiz için orada bir pencere yönetici programın (yani masaüstü sisteminin)
kurulu olması gerekir. Raspberry Pi güçlü bir donanıma sahip olduğu için ve kişisel bir bilgisayar gibi kullanılabildiği için
bu aygıtlara yüklediğimiz Linux sistemlerinde pencere yöneticisi zaten bulunuyor olabilir. Ancak server sistemlerinde ve pek çok
gömülü Linux sisteminde bir pencere yöneticisi bulunmamaktadır. Bu durumda erişim genellikle SSH protokolü ile sağlanmaktadır.
Eskiden SSH protokolünden önce Telnet isimli benzer bir protokol kullanılıyordu. Ancak Telnet protokolünün güvenilirliği zayıf
olduğu için zaman içerisinde SSH protokolü geliştirildi. Bugün konsol tabanlı bir ortamda bir Linux sistemine uzaktan bağlanmak
için genellikle SSH protokolü kullanılmaktadır.
Her türlü TCP/IP uygulamalarında haberleşmenin yapılabilmesi için bir "server" program ile bir de "client" programın bulunuyor
olması gerekir. Bize erişimi sağlayan uzak makinedeki program "server" programdır. Bizim erişmek için kullandığımız program
ise "client" programdır. SSH server ve client programlar zaten işletim sistemlerinin pek çoğunun içinde default bir biçimde
bulunmaktadır. Biz Raspberry Pi'ımıza Raspberry OS işletim sistemini kurduğumuzda zaten SSH client ve server programlar yüklü
durumdadır. Ancak eğer gömülü sisteminizde SSH server program bulunmuyorsa onu şöyle kurabilirsiniz:
$ sudo apt-get install openssh-server
Bu işlem SSH server programının kurulup çalışır hale getirilmesini sağlamaktadır. Client program da benzer biçime kurulabilir:
$ sudo apt-get install openssh-client
ssh client program ile bağlantı aşağıdaki gibi sağlanabilir:
$ ssh user_name@host_name
Bizim bağlantı sağlayabilmek için uzak makinede bir kullanıcının ismini ve parolasını biliyor olmamız gerekir. SSH client programı
Windows ve macOS sistemlerinde de benzer komut satırı argümanlarıyla hazır bir biçimde bulunmaktadır. Dolayısıyla Windows ve
macOS sistemlerinden de gömülü aygıtınıza benzer biçimde bağlanabilirsiniz. SSH programı ile bağlantı yaparken kullanıcı ismini
"-l" seçeneği ile de belirtebilirsiniz. Örneğin:
$ ssh -l user_name host_name
VNC ile bağlantı da yine bir VNC server programıyla bir de VNC client programının karşılıklı makinelerde yüklü olması gerekmektedir.
Bizim bağlanmak istediğimiz makinede server programının çalışıyor olması, bağlantıyı sağlamak istediğimiz tarafta da client programın
yüklü olması gerekir. Raspberry Pi'daki eski Raspbian işletim sisteminde VNC server hazır bir biçimde bulunmuyordu. Ancak belli
süre sonra artık Raspberry Pi OS içerisinde zaten VNC server programı hazır bir biçimde bulunmaktadır. Ancak VNC server hazır bir
biçimde bulunuyor olsa da onun çalışır hale getirilmesi gerekmektedir. Bu işlem pratik olarak ana menüden "Preferences/Raspberry Pi
Configurations/Interfaces" sekmesinden yapılabilir. Yukarıda da belirttiğimiz gibi VNC server için Linux sistemimizde bir pencere
yöneticisinin çalışıyor olması gerekir. Yani içerisine grafik arayüz yüklenmemiş olan bir Linux sistemine VNC ile bağlanmanın da
bir anlamı yoktur.
VNC server ve client program olarak çeşitli programlar kullanılabilmektedir. Linux'ta en yaygın kullanılan VNC server program
"tightvncserver" isimli programdır. Bunun kurulumu şöyle yapılabilir:
$ sudo apt-get install tightvncserver
Ancak server program kurulduktan sonra bazı ayarlamaların yapılması gerekmektedir. Bu konu ileride başka bir bölümde ele
alınacaktır.
Biz pencere yönetici sisteminin bulunduğu bir Linux sistemine Microsoft'un "Remote Desktop Protocol(RDP)"ünü kullanarak da
bağlanabiliriz. Tabii bunun için de bağlanacağımız makinede RDP server programının çalışıyor durumda olması gerekmektedir.
Bu protokol Microsoft'a ait olduğu için Linux sistemleri tarafından aktif bir biçimde kullanılmamaktadır. RDP server programı
aşağıdaki gibi kurulabilir:
$ sudo apt-get install xrdp
RDP protokülü için client program olarak genellikle Windows'taki "Uzak Masaüstü Bağlantısı" kullanılmaktadır. Ancak bu
protokol için başka client programlar da bulunmaktadır.
VNC ve RDP protokolleri hem Linux sistemlerinde hem de Windows ve macOS sistemlerinde kullanılabilmektedir. Windows dünyasında
RDP programları VNC programlarına göre daha hızlı bir biçimde çalışmaktadır. Ancak Linux'ta VNC programları RDP programlarına
göre daha hızlıdır.
-----------------------------------------------------------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------------------------------------------------------
BeagleBoard'lar en yaygın kullanılan SBC'ler arasındadır. Biz de kursumuz Beaglebone Black (BBB) kullanacağımızı söylemiştik.
BBB'nin dokümantasyonuna aşağıdaki bağlantıdan erişilebilir:
https://docs.beagleboard.org/latest/https://docs.beagleboard.org/latest/
BBB kendi içerisinde ismine "eMMC (Embedded Multi-Media Card)" denilen on-board flash belleğe sahiptir. Zaten ürün satın
alındığında bu flash belleğin içerisinde bir Debian Linux dağıtımı yüklü durumdadır. Bu nedenle biz board'umuzu güç kaynağına
taktığımızda zaten default olarak bu on-board flash içerisindeki Linux boot edilmektedir. BBB'yi kullanıma hazır hale getirmek
için şunlar yapılmalıdır:
1) BBB'ye güç kaynağını bağlamak için iki soket kullanılabilmektedir. Birincisi eski tip yuvarlak sokettir (DC barrel jack).
İkincisi ise mini USB soketidir. Kullanıcılar genellikle güç kaynağını mini USB soketine bağlamaktadır. (Tabii bu mini USB
girişi doğrudan masaüstü bilgisayarımızın USB girişine bağlanabilir. Bu durumda gücü buradan alacaktır.)
2) BBB üzerinde bir tane standart USB soket vardır. Genellikle bu sokete combo klavye fare bağlanmaktadır. Ancak birden fazla
bağlantı için USB hub kullanılabilir.
3) BBB'nin klasik modellerinde internet için "wireless" bağlantı yoktur. Dolayısıyla internet bağlantısı sağlamak için ethernet
soketi kullanılmaktadır. Ancak on-board flash üzerine yüklenmiş olan Debian içerisinde "Internet over USB" için gerekli aygıt
sürücüler (device drivers) bulunmaktadır. Bu sayede biz örneğin mini USB kablosu ile BBB'yi Windows ya da Linux makinemize
bağlayıp BBB'nin oradaki interneti kullanmasını sağlayabiliriz.
4) BBB'de de Raspberry Pi'da olduğu gibi micro HDMI soketi vardır. Bu sokete doğrudan monitörümüzü bağlayabiliriz.
5) BBB'de iki önemli düğmecik bulunmaktadır. Bunlardan biri SD kartın yanındaki (USB soket tarafındaki) düğmeciktir. Bu düğmeciğe
"boot düğmeciciği (Boot button)" denilmektedir. Diğer düğmecik ise ethernet soketinin hemen yanında bulunmaktadır. Buna da
"reset düğmeciği (reset button)" denilmektedir. Boot düğmeciği SD karttan boot sürecini başlatmak için reset düğmeciği ise
sistemi reset etmek için kullanılmaktadır.
Tipik olarak BBB'yi ilk kez kullanırken mini USB soketini masaüstü bilgisayarımızın standart USB soketine takarız. Böylece
masaüstü bilgisayarımız otomatik olarak BBB'nin on-board flash belleğindeki bir disk bölümünü bir sürücü biçiminde görür.
Bu sürücü içerisinde host sistem için gerekli olan aygıt sürücüler bulunmaktadır. Eğer host makine olarak Windows'ta çalışıyorsak
aygıt sürücüleri yüklerken "UEFI BIOS'tan imzasız aygıt sürücüleri için" izin vermemiz gerekir. Bunun için aşağıdaki bağlantıdaki
yönergeleri izleyebilirsiniz:
https://www.terasic.com.tw/wiki/Disable_Driver_Signature_Enforcement_in_Windows10_x64
Biz bu biçimde USB bağlantısı yaptığımızda artık IP protokol ailesini USB üzerinden kullanabilir duruma geliriz. Dolayısıyla
SSH ile BBB'ye bağlanabiliriz. BBB'de yüklü olan Debian dağıtımının default kullanıcı ismi "debian", default parolası ise "temppwd"
biçimindedir. Tabii hazır yüklü olan Linux dağıtımının klavye ayarları İngilizce'dir. Türkçe klavye ile yazarken buna dikkat
ediniz. SSH bağlantısı için BBB'deki IPv4 adresi "192.168.7.2" biçimindedir. Yani bağlantı aşağıdaki gibi yapılabilir:
$ ssh debian@192.168.7.2
parola olarak da "temppwd" girilmelidir. On-board flash üzerine yüklenmiş olan Debian dağıtımında bir pencere yönetici program
bulunmamaktadır. Zaten BBB'nin on-board flash belleği 4GB'dir.
Biz BBB'nin mini USB kablosunu host makinemize bağladığımızda artık host makinemizden BBB'ye SSH yoluyla erişebiliriz. Ancak
BBB'deki Linux sisteminin masaüstü host makinemizdeki interneti kullanabilmesi için Windows ve Linux sistemlerinde bazı
ayarların da yapılması gerekmektedir. Tabii BBB'nin interneti kullanabilmesini sağlamanın en normal ve hızlı yolu doğrudan
ADSL Router'ımızdan gelen Ethernet RJ45 jakını BBB'ye takmaktır. Biz "Internet over USB" yerine bu yöntemi kullanmanızı
öneriririz.
-----------------------------------------------------------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------------------------------------------------------
6. Ders 21/03/2024 - Perşembe
-----------------------------------------------------------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------------------------------------------------------
BBB'ni on-board flash belleğine işletim sisteminin yeni bir sürümümü yerleştirebiliriz. Aslında Beagleboard için hazır imajlar
zaten bulundurulmaktadır. Aşağıdaki bağlantıdan size uygun olan hazır imajları indirebilirsiniz:
https://www.beagleboard.org/distros
On-board flash belleğe işletim sistemini yüklemek için sırasıyla şu adımlardan geçilmelidir:
1) Yukarıda belirttiğimiz sayfadan BBB için uygun sürüm indirilir. Bu sayfadaki hazır imajların bir bölümünde "Flasher"
ibaresi vardır. Bu "flasher" ibareli imajlardan biri indirilmelidir. Örneğin sınıftaki denemede aşağıdaki imaj indirilmiştir:
AM335x 11.7 2023-09-02 4GB eMMC IoT Flasher
Buradaki "IoT" sözcüğü indirilecek Debian dağıtımının IoT amaçla oluşturulmuş minimalist bir dağıtım olduğunu belirtmektedir.
Örneğin alternatif bir imaj da şu olabilir:
AM335x 11.7 2023-09-02 4GB eMMC Xfce Flasher
Burada "IoT" ibaresi yerine "Xfce" ibaresi bulunmaktadır. Xfce küçük bir pencere yöneticisidir. Ancak maalesef bu pencere
yöneticisi bile BBB'nin pek çok versiyonunda sistem kısıtları nedeniyle çok yavaş çalışma eğilimindedir.
2) İndirilen imaj zip'li olduğu için açılmalıdır. Açılan imajın uzantısının ".img" olması gerekir.
3) İmaj SD karta Rufus ya da Etcher benzeri bir programla yazılmalıdır.
4) SD karta yazma işlemi bittikten sonra SD kart BBB'nin SD kart yuvasına takılır. Sonra "Boot düğmeciği" denilen küçük
düğmeciğe basılarak board'a güç verilir. Güç verildikten sonra 7, 8 saniye boot düğmeceğine basılmaya devam edilmelidir.
Sonra el boot düğmeciğinden çekilir. BBB'nin dört LED'i önce tamamen yanar. Sonra sırasıyla yanıp sönmeye başlar. Bu durum
yazmanın başladığı anlamına gelmektedir. Yazma takriben 5 dakika civarında sürmektedir. Yazma bittikten sonra LED'ler
tamamen söner. (Boot düğmeciği Micro SD kartın yanındaki (USB portun bulunduğu taraftaki) düğmeciktir.
5) SD kart çıkartılarak sistem yeniden boot edilir. Artık on-board flash üzerine çektiğimiz işletim sistemi ile boot işlemini
yapmış olduk. Ancak bizim indirdiğimiz imaj İngilizce (US) olarak ayarlanmıştır. Dolayısıyla default klavye ayarları da
İngilizce klavye biçimindedir.
-----------------------------------------------------------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------------------------------------------------------
Debian türevi sistemlerde klavye ayarlarını değiştirmenin birkaç yolu vardır. Öncelikle locale ayarlarının Türkiye ve Türkçe
biçiminde yapılmasını tavsiye ederiz. Çünkü BBB için hazır bulundurulan Debian dağıtımında default locale ayarları Amerika
ve İngilizce biçimindedir. Bunu sağlamanın bir yolu aşağıdaki komutu kullanmaktadır:
$ sudo dpkg-reconfigure locales
Karşımıza bir menü gelecektir. Bu menüden locale'i "tr_TR.UTF-8" biçiminde ayarlayabilirsiniz. Bu ayarlamadan sonra artık
/etc/default/locale dosyası aşağıdaki gibi olacaktır:
# File generated by update-locale
LANG=tr_TR.UTF-8
Ancak locale'in ayarlanması klavye düzenini değiştirmemektedir. Locale'in ayarlanması birtakım mesajların Türkçe çıkmasını,
terminal aygıt sürücüsünün girdi ve çıktılarının encoding'ini belirlemektedir. Klavye düzeni manuel olarak "/etc/default/keyboard"
dosyası üzerinde güncelleme yapılarak ayarlanabilir. Bu dosyanın BBB'deki default içeriği şöyledir:
# KEYBOARD CONFIGURATION FILE
# Consult the keyboard(5) manual page.
XKBMODEL="pc105"
XKBLAYOUT="us"
XKBVARIANT=""
XKBOPTIONS=""
BACKSPACE="guess"
Bizim Türkçe klavye için buradaki XKBLAYOUT satırını aşağıdaki gibi değiştirmemiz gerekir:
XKBLAYOUT="tr"
Ancak bu dosyada değişiklik yapılması klavye düzeninin değişeceği anlamına gelmemektedir. Bu ve birkaç dosyaya bakarak klavye
düzenini ayarlayan bazı programlar vardır. Bunların çalıştırılması gerekir. Bunun için "setupcon" programı kullanılabilir:
$ sudo setupcon
Artık klavyemiz Türkçe olarak ayarlanmıştır. Ancak iki problem daha vardır. Birincisi BBB'deki Debian dağıtımındaki default
console fontu Türkçe'yi desteklememektedir. Yani klavyedeki tuşların yerleri doğru olarak ele alınmaktadır ama Türkçe
karakterler doğru görüntülenememektedir. İkinci sorun ise BBB'yi reboot ettiğimizde yaptığımız ayarların otomatik devreye
girmemesidir.
Console ekranının fontunu değiştirmek için "/etc/default/console-setup" dosyasının edit edilmesi gerekmektedir. Bu dosyasının
BBB'deki default durumu şöyledir:
# CONFIGURATION FILE FOR SETUPCON
# Consult the console-setup(5) manual page.
ACTIVE_CONSOLES="/dev/tty[1-6]"
CHARMAP="ISO_8859-15"
CODESET="guess"
FONTFACE="Fixed"
FONTSIZE="8x16"
VIDEOMODE=
# The following is an example how to use a braille font
# FONT='lat9w-08.psf.gz brl-8x8.psf'
Bizim burada CHARMAP satırını aşağıdaki gibi UTF-8 olarak güncellememiz gerekir:
CHARMAP="UTF-8"
Şimdi artık sistemi reboot ettiğimizde login ekranındaki klavye düzeni İngilizce olsa da login olup "setupcon" programını
çalıştırdığımızda her şey Türkçe'ye göre ayarlanmış olacaktır.
Biz klavyeyi ve console fontlarını ayarlarken bazı dosyaları güncelledik. Aslında bu dosyaları manuel olarak edit etmek yerine
bunları güncelleyen küçük programlardan da faydalanılabilir. Örneğin aslında "sudo dpkg-reconfigure locales" komutu
"/etc/default/locale" dosyası üzerinde güncelleme yapmaktadır. Benzer biçimde "sudo dpkg-reconfigure console-data" komutu
da aslında "/etc/default/console-setup" dosyasını güncellemektedir. Bazen klavye ayarlarını çalışırken o anda başka bir dille
de değiştirmek isteyebiliriz. Bunun için "loadkeys" isimli program kullanılmaktadır. Bu program klavye düzenek dosyasını
argüman olarak alıp klavyeyi ona göre ayarlamaktadır.
Yukarıda da belirttiğimiz gibi biz Türkçe ayarlarını yapmış olsak da bu ayarları etkili hale getirmek için "setupcon"
programını çalıştırmamız gerekir. Bu nedenle BBB'mizi reboot ettiğimizde login ekranında yine klavye İngilizce'de kalacaktır.
Bunu kalıcı ayarlamanın bir yolu "sudo update-initramfs -u" işlemidir. Diğer yolu ise sistem boot edildiğinde otomatik olarak
bu "setupcon" programının çalıştırılmasını sağlamaktır. Bu konular ileride ele alınacaktır.
-----------------------------------------------------------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------------------------------------------------------
Yukarıdaki ayarlama işlemlerinden de görüldüğü gibi aslında birtakım ayarlar "/etc" dizinin altındaki çeşitli dosyalarda
saklanmaktadır. Çeşitli programlar da ayarları bu dosyalara bakarak set etmektedir. Microsoft eskiden Linux'takilere benzer
ismine "ini dosyaları" denilen ayar dosyalarını kullanıyordu. Daha sonra "registry" denilen tüm ayarların saklandığı mini
bir hiyerarşik veritabanı sistemine geçti. Ancak UNIX/Linux sistemlerinde böyle bir merkezi ayar sistemi kullanılmamaktadır.
Her ayar "/etc" dizininin altında belli formattaki dosyaların içerisinde saklanmaktadır.
-----------------------------------------------------------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------------------------------------------------------
Sizin de gördüğünüz gibi Raspberry Pi donanımı BBB'ye göre oldukça güçlüdür. Raspberry Pi'ın SD kartına yüklediğimiz
işletim sistemleri oldukça dolu bir biçimdedir. Çünkü bu sistemler tam bir bilgisayar gibi kullanılsın istenmiştir. Halbuki
BBB'nin kaynakları zayıf olduğu için hazır imajlar genellikle dolu bir biçimde değildir. Örneğin UNIX/Linux sistemlerinde
yardım almak için kullanılan "man" programı BBB'nin default imajında bulunmamaktadır. "man" programını ve onun kullandığı
önemli veri dosyalarını aşağıdaki gibi yükleyebiliriz:
$ sudo apt install man-db manpages-posix
$ sudo apt install manpages-dev manpages-posix-dev
-----------------------------------------------------------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------------------------------------------------------
BBB'yi on-board flash (eMMC) üzerine yüklü olan Linux sistemiyle açmak zorunda değiliz. SD kartımıza Linux kurup SD kart ile
de boot edebiliriz. SD karttan boot işlemi için yine "boot düğmeciğine basılı olarak board'a güç verilir. Led'ler yandığında
basılı olan boot düğmeciğinden el bırakılır. Böylece boot işlemi SD karttan hareketle başlatılacaktır. (Ayrıca internal eMMC'de
bir boot loader yoksa yine boot işlemi otomatik olarak SD karttan başlatılmaktadır.) SD karta yazacağınız Linux sistemine
dikkat ediniz. Buraya "flasher" olmayan bir imajı yerleştirmelisiniz. SD kartınıza yükleyeceğiniz hazır Debian imajını aşağıdaki
bağlantıdan indirebilirsiniz:
https://www.beagleboard.org/distros
Örneğin buradan SD kartınız için aşağıdaki imajı indirebilirsiniz:
AM335x 11.7 2023-09-02 4GB microSD IoT
Beagleboard Black kartınızın boot süreci kursumuzun ayrı bir bölümünde ayrıntılı bir biçimde ele alınacaktır.
-----------------------------------------------------------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------------------------------------------------------
7. Ders 26/03/2024 - Salı
-----------------------------------------------------------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------------------------------------------------------
Kursumuzun bu bölümünde gömülü Linux sistemlerinde C/C++ ile yazılım geliştirmek için kullanılan toolchain'ler üzerinde
duracağız. Kursumuzda "toolchain" sözcüğünü bazen bu biçimde İngilizce olarak bazen de "araç zinciri" biçiminde Türkçe
olarak kullanacağız.
-----------------------------------------------------------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------------------------------------------------------
Aşağı seviyeli (C/C++, sembolik makine dilleri) biçimde yazılım geliştirmek için kullanılan araçlardan oluşan topluluğa
"araç zinciri (toolchain)" denilmektedir. Bir araç zincirinin tipik bileşenleri şunlardır:
- C ve C++ Derleyicileri (C and C++ Compilers)
- Sembolik Makine Dili Derleyicileri (Assemblers)
- Bağlayıcılar (Linkers)
- Binary Araçlar (Binary Utilities). Bu araçlar aşağı seviyeli işlemler için gerekebilen programlardan oluşmaktadır.
- Debugger'lar. Bunlar hataların tespit edilmesi ve çözümlenmesi amacıyla kullanılmaktadır.
- C ve C++'tan kullanılabilecek temel kütüphaneler. (Örneğin standart C kütüphanesi, POSIX kütüphanesi gibi.)
- Emülatörler ve Simülatörler (Emulators amd Simulators). Her türlü araç zincirinde bu bileşenler bulunmayabilir.
- Build Otomasyon Araçları (Build Automation Tools). Örneğin make ve cmake gibi araçlar.
- Geliştirme İçin Gerekli Olan Diğer Dosyaların Bulunduğu "sysroot" Dizini. Programların derlenip bağlanabilmesi için
bazı öğelerin bazı dizinler içerisinde bulunması gerekmektedir.
Her araç zincirinin bu öğelerin hepsini içermesi gerekmez. Bazı araç zincirleri de daha fazla öğe de içerebilir. Burada bir
noktaya dikkatinizi çekmek istiyoruz. Gömülü Linux sistemlerinde "araç zinciri (toolchain)" demekle "aşağı seviyeli araçlar"
kastedilmektedir. Yani örneğin araç zincirleri içerisine Java, .NET, Python gibi platformlarda yazılım geliştirmek için
gerekli olan araçlar dahil değildir.
-----------------------------------------------------------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------------------------------------------------------
Kursumuzda kimi zaman çapraz derleme (cross compile) işlemleri yapacağız. Bu durumda host makine ile hedef makine arasında
dosya transfleri yapmamız gerekecek. İki makine arasında dosya transferi yapmak için genellikle IP protokol ailesinin sunduğu
olanaklar kullanılmaktadır. Bunun için en çok kullanılan utility program "scp" isimli programdır. Bu program "Secure Copy
Protocol" denilen bir protokol yoluyla arka planda SSH kullanarak dosya transferini yapmaktadır. scp programının tipik
kullanımı şöyledir:
$ scp dosya_yol_ifadesi kullanıcı_ismi@uzak_makine
Burada uzak_makine ip adresi ya da host ismi biçiminde belirtilebilir. Örneğin:
$ scp app debian@192.168.7.2:
Burada app dosyası uzak makinenin debian kullanıcısının home dizinine kopyalanmaktadır. (host isminden sonra ':'
karakterinin bulundurulması zorunludur.) Örneğin:
$ scp app debian@192.168.7.2:/Test
Burada app dosyası uzak makinedeki debian kullanıcısının home dizini içerisindeki "Test" dizinine kopyalanacaktır. Tabii scp
ile hedef makineden host makineye ters yönde de kopyalama yapabiliriz. Örneğin:
$ scp debian@192.168.7.2:app app
Burada hedef makinedeki app dosyası app ismiyle host makineye kopyalanmaktadır. scp ile bir dizin bütünsel olarak da transfer
edilebilir. Bunun için "-r" seçeneğinin kullanılması gerekmektedir. Örneğin:
$ scp -r Src debian@192.168.7.2:
Burada yerel makinedeki Src dizininin tamamı uzak makineye kopyalanmaktadır.
scp programının ayrıntıları için ilgili man sayfalarına başvurabilirsiniz.
Uzak makineye dosya transfer etmek için diğer pratik bir yöntem de "sshfs" denilen dosya sistemini kullanmaktır. Bu dosya
sistemi uzak makinedeki bir dizini yerel makinede bir dizin gibi göstermektedir. Böylece biz o dizine dosya kopyaladığımızda
sshfs dosya sistemi onu otomatik olarak hedef makineye transfer etmektedir. Tabii sshfs Linux sistemlerini kurduğumuzda sistemin
bir parçası biçiminde yüklü durumda değildir. Onun aşağıdaki gibi indirip kurabiliriz:
$ sudo apt-get install sshfs
Kurulumu yaptıktan sonra yerel makinede mount edilecek dizini yaratmamız gerekir. Örneğin:
$ mkdir BBB
Artık mount işlemini şöyle yapabiliriz:
$ sshfs BBB debian@192.168.7.2:
Artık BBB dizinimiz uzak makinedeki kullanıcının home dizini gibi olmuştur. Yani biz bu BBB dizinine dosya kopyaladığımızda
aslında onu uzak makineye kopyalamış oluruz. Benzer biçimde uzak makinede home dizinine bir dosya kopyalandığında biz bu
dosyayı BBB dizininde otomatik olarak görürüz.
Mount ettiğimiz dizinin uzak bağlantı yaptığımız makineden kopartılması için "umount" işleminin uygulanması gerekir.
umount komutunda dizin ismi argüman olarak verilmektedir. Örneğin:
$ umount BBB
Yerel makine ile uzak makine arasında dosya transfer etmenin diğer bir yolu da FTP (File Tranfer Protocol) protokülünü
kullanmaktır. Ancak bunun için uzak makinede bir FTP sunucusunun yüklü olması gerekir. Düşük kapasiteli gömülü aygıtlarda
geliştirici bu server'ı uzak makineye yüklemek istemeyebiir. FTP server ve client programların Linux sistemlerine nasıl
kurulacağını ilgili dokümanlardan öğrenebilirsiniz.
-----------------------------------------------------------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------------------------------------------------------
Araç zincirlerini iki bölüme ayırabiliriz:
1) Doğal Araç Zincirleri (Native Toolchains)
2) Çapraz Araç Zincirleri (Cross Toolchains)
Doğal araç zincirleri genellikle dağıtımların içerisinde zaten hazır bir biçimde bulunmaktadır. Örneğin Raspberry Pi için
Raspberry Pi OS'yi yüklediğimizde, Beaglebone Black için Debian dağıtımını yüklediğimizde zaten onun içerisinde doğal araç
zincirleri bulunmaktadır. Doğal araç zincirleri doğrudan ilgili sistem üzerinde yazılım geliştirilirken kullanılmaktadır.
Örneğin biz Raspberry Pi için yazılımımızı doğrudan Raspberry Pi üzerinde geliştirebiliriz. Bu durumda orada yüklü olan doğal
araç zincirini kullanabiliriz. Raspberry Pi donanımları (özellikle 4 ve 5) çok güçlü olduğu için doğal araç zincirleri ile
geliştirme yapmak artık iyi bir seçenek durumundadır. Ancak Beaglebone Black gibi aygıtların sistem kaynakları daha kısıtlı
olduğu için doğrudan bunların üzerinde geliştirme yapmak zor hatta bazen olanaksız hale gelebilmektedir.
Çapraz araç zincirleri (cross toolchains) geliştirmenin güçlü bir makine üzerinde yapılmasını sağlayan, hedef aygıt için kod
üreten araç zincirleridir. Buradaki çapraz (cross) sözcüğü üretilen kodun geliştirmenin yapıldığı makineye değil, başka bir
hedef (target) makineye ilişkin olduğunu belirtmektedir. Eğer hedef makine etkin bir geliştirme yapmaya olanak sağlamıyorsa
bu durumda çapraz araç zincirleri kullanılabilir. Örneğin Beaglebone Black için tipik olarak çapraz araç zincirleri kullanılmaktadır.
Pekiyi doğal araç zincirleri mi yoksa çapraz araç zincirleri mi tercih edilmelidir? İşte eğer Raspberry Pi'da olduğu gibi
hedef donanım güçlüyse doğal araç zincirlerinin kullanılmasını tavsiye ederiz. Çünkü doğal ortamda geliştirme yapılırken denemeler
o anda geliştirme yapılan makinede çok daha hızlı yapılabilmektedir. Ancak hedef makine yeteri kadar güçlü değilse güçlü bir
host makinede çapraz araç zincirleriyle geliştirmenin yapılmasını öneririz. Araç zinciri denildiğinde zaten default olarak
çapraz araç zincirleri kastedilmektedir.
Araç zincirlerini başka bakımlardan da sınıflandırabiliriz. Örneğin araç zincirini "tedarik eden (vendor)" kuruma göre,
kullanılan derleyici sistemlerine göre de sınıflandırılabiliriz.
-----------------------------------------------------------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------------------------------------------------------
Araç zincirlerinin isimlendirilmesi genellikle "hedef (target) sisteme" göre yapılmaktadır. İsimlendirmede '-' karakterleriyle
ayrılmış üç alan ya da dört alan kullanılabilmektedir. Üçlü (triple) isimlendirmede ismin alanları şunlardır:
CPU-Tedarikçi-İşletimSistemi
Dörtlü isimlendirmede ayrıca bir de ABI alanı bulundurulmaktadır. Dörtlü isimlendirmenin de genel biçimi şöyledir:
CPU-Tedarikçi-İşletimSistemi-ABI
Buradaki bileşenlerin hepsi hedef makineye ilişkin bileşenlerdir. Ancak araç zincirlerindeki isimlendirme biçimi herkes
tarafından uyulan, resmi bir standardı olan kural niteliğindeki biçimler değildir. Gevşek kurallardır. Üçlü ya da dörtlü
isimlendirmeye uymayan ya da kısmen uyan araç zincirleri de bulunmaktadır.
Şimdi bazı örnekler vermek istiyoruz.
i686-apple-darwin10-gcc-4.2.1
Bu araç zinciri Intel'in 32 bit işlemcilerine ilişkin (x86) kod üretilmektedir. Tedarikçi (vendor) Apple şirketidir. Yani araç
zinciri Apple firması tarafından hazırlanmıştır. Hedef işletim sistemi darwin10'dur. Yani oluşturulacak kod bu işletim sistemi
tarafından çalıştırılacaktır. (macOS işletim sisteminin kernel'ına "Darwin" denilmektedir. Dolayısıyla buradaki Darwin aslında
macOS anlamındadır.) Kullanılan ABI versiyonu gcc-4.2.1 tarafından kullanılan default ABI'yi belirtmektedir.
arm-none-linux-gnueabi
Burada ARM kodu üretilmektedir. Tedarikçinin olmaması bunun manuel üretildiği anlamına gelebilmektedir. Burada yine kodun
Linux işletim sistemi için üretileceği belirtilmektedir. ABI için kullanılan "gnueabi" tipik olarak GNU araç zincirini ve
gömülü sistemler için kullanılan ABI'yi belirtmektedir. (Buradaki eabi "extended abi" anlamına gelmektedir.).
arm-linux-gcc
Burada ARM üzerinde çalışan Linux sistemleri için kod üretilecektir. gcc derleyicisinin o sistemdeki default ABI'si
kullanılacaktır.
i686-unknown-linux-gnu
Burada tipik olarak 32 bit Intel işlemcileri üzerinde çalışan Linux sistemleri için kod üretilecektir. ABI bu sistemlerde
kullanılan default ABI'dir. Buradaki "gnu" GNU araç zincirini belirtmektedir.
x86_64-w64-mingw32
Buradaki araç zinciri 64 bit Intel işlemcilerini kullanan 64 bit Windows sistemleri için kod üretmektedir. Araç zinciri
MinGW dağıtımını referans almaktadır. Dolayısıyla oradaki ABI'yi kullanmaktadır.
arm-none-eabi
Burada ARM kodu üretilmektedir. Ancak herhangi bir işletim sistemi hedef alınmamıştır. İşletim sisteminin belirtilmediği
durum genellikle "bare metal" araç zinciri anlamına gelmektedir.
Örneğin Windows'ta sanal makineye kurduğumuz Intel işlemcisini kullanan Mint dağıtımındaki gcc derleyicisinin izini sürelim: