1 周末班上课笔记 2 1.从redhat centos过度到ubuntu 3 a)修改网络配置 4 b)ubuntu安装 5 建议在安装ubuntu的过程中断网 6 分区: 7 建议分3个区 8 1.home分区 100G----->/home 9 2.交换分区 8G 10 3.根分区 30G------>/ 11 c)软件管理 12 centos redhat --->yum rpm 13 ubuntu----------->apt dpkg 14 d)用户 15 建议:在ubuntu下建议不要使用root 16 如果想要root权限,只需要在执行命令的时候加sudo 17 sudo apt-get install minicom 18 e)新装的ubuntu系统需要更新系统 19 sudo apt-get update 20 f)新装的ubuntu系统需要安装的软件包 21 www.embsky.com 22 在站内搜索:ubuntu----><新装ubuntu系统需要安装的包> 23 g)unity gnome2 gnome3 24 sudo apt-get install gnome 25 26 2.嵌入式系统分类 27 无操作系统 28 单片机 29 带操作系统 30 单片机--->ucos 31 SOC------>linux/Android/win 32 33 3.arm历史 34 官网:www.arm.com 35 arm公司不做芯片,只设计处理器架构 36 arm1 arm2 arm3 ..... arm6 37 半导体公司:ST TI 三星 NXP 高通 ADI 38 华为 小米 联发科 全志 龙芯 .......... 39 cpu SOC = cpu+控制器+总线 40 经典处理器: 41 arm7--------->S3C44B0 42 arm9--------->S3C2410/S3C2440 43 arm11-------->S3C6410 44 45 cortex系列处理器: 46 arm-cortex-a 47 application 48 a8 S5PV210 单核 三星 49 Am335 单核 TI 50 a9 51 Exynos4412 4核 52 Omap4460 2核 53 Imax6Q 4核 54 Imax6D 2核 55 S5P4418 4核 56 a15 57 Exynos5210 58 a53 59 64位 60 S5P6818 8核 61 a72 62 64位 63 arm-cortex-m 64 mcu 65 m3 stm32f103 66 m4 stm32f407 67 arm-cortex-r 68 realtime 69 r4/r6 70 71 4)开发板sdk下载 72 a)从教师及ftp下载 73 b)从www.embsky.com下载 74 c)解压sdk 75 tar -xvf s5p6818sdk_lzy1.tar.bz2 -C /var/ftp/embsky/source/zmb/ 76 77 5)嵌入式软件架构 78 79 app 80 游戏 软件 桌面 ..... 81 文件系统 buildroot 82 文件管理 83 kernel linux/Android 84 进程管理 内存管理 文件系统 网络设备 设备驱动 85 bootloader uboot 86 初始化硬件 引导内核 87 ----------------------------------------------------- 88 arm---->SOC+lcd+soud+net+ts+sensor...... 89 mips 90 ppc 91 92 6)开发方式 93 第一手开发---->原厂 94 第二手开发---->做开发板 95 第三手开发---->项目 96 97 7)Android系统和Linux系统 98 Android: 99 emmc{bootloader uImage ramdisk [system][data][cache][storage]} 100 bootloader--->uImage--->ramdisk / 101 /system 挂载system分区 102 /data 挂载data分区 103 /cache 挂载cache分区 104 /storage 挂载storage分区 105 Linux: 106 emmc{bootloader uImage [rootfs]} 107 108 8)搭建嵌入式开发环境之刷Linux系统 109 a)制作刷机sd卡 /dev/sdb2 110 sd{ 80M(uboot) [ ] [ ]} 111 /dev/sdb /dev/sdb1 112 bootloader 513字节 113 芯片要求 114 S5P6818--->rom---->513 115 <详细内容请查看视频> 116 117 b)把uboot烧写到sd卡 118 sudo dd if=ubootpak.bin of=/dev/sdb seek=1 119 sync 120 121 c)配置minicom 122 作用:能够操作PC的串口 123 115200 8N1 124 125 d)刷机 Linux 126 emmc{ubootpak.bin [boot.img][rootfs.ext2][][][][][]} 127 /dev/mmcblk0 128 /dev/mmcblk0p1 129 /dev/mmcblk0p2 130 bootloader--->uImage---->rootfs 131 132 e)修改uboot环境变量 133 倒数3秒 134 [zyli@Uboot]# set bootcmd "ext4load mmc 2:1 0x48000000 uImage;bootm 0x48000000" 135 [zyli@Uboot]# set bootargs root=/dev/mmcblk0p2 tp=gslx680-linux 136 [zyli@Uboot]# save 137 拔出sd卡 138 f)重启开发板 139 [zyli@Uboot]# reset 140 相关内容请查看:<minicom配置.mp4> <刷机(linux).mp4> <制作sd卡分区.mp4> 141 142 soc+ddr(1G)+emmc(8) 143 socs5p6818支持3中启动方式:1.sd卡 2.emmc 3.usb 144 sd卡中的bootloader运行:bootloader提供一个命令fastboot 145 146 9)搭建嵌入式开发环境之刷Android系统 147 相关内容请查看:<刷机Android.mp4> 148 149 10)编译嵌入式系统ROM(Linux) 150 a)bootloader 151 相关内容请查看:<编译uboot.mp4> 152 b)kernel 153 tar -xvf linux-3.4.tar.bz2 154 cd kernel 155 vim Makefile 156 CROSS_COMPILE= 157 make x6818_defconfig 158 make menuconfig 159 make -j4 160 make uImage 161 162 编译完成的内核在<linux_src>/arch/arm/boot/uImage 163 接下来要把uImage打包到boot.img中 164 tar -xvf boot.tar.bz2 165 cp ../src/kernel/arch/arm/boot/uImage boot/ 166 ./make_ext4fs -s -l 64M -L linux boot.img ./boot 167 168 c)rootfs 169 / 170 [------------------[/bin /sbin /usr/bin /usr/sbin /etc /dev /var ..../root /home/xxx]] 171 busybox工具集 172 mplayer 173 mpg123 174 qt库 175 sqlite 176 mysql 177 python 178 179 buildroot 工具 180 ----->rootfs 181 182 tar -xvf buildroot.tar.bz2 183 cd buildroot 184 make x6818_defconfig 185 make -j4 186 187 编译过程中ncruse出错 188 vim output/build/host-ncurses-5.9/include/curses.tail 189 删掉/* generate */ 190 make -j4 191 192 11)bootloader kernel rootfs运行方式 193 刷机: bootloader kernel rootfs----->都在emmc 194 195 开发: 196 booloader--->sd卡 197 kernel------>在PC,由bootloader通过网络下载到板子的内存 198 rootfs------>在PC,板子的内核启动后通过nfs挂在根文件系统 199 200 总结: 201 1.理论基础:嵌入式 物联网 Android/Linux arm/SOC 202 2.刷机:Linux/Android 203 原因:产品 204 3.下载内核:tftp 205 原因:开发阶段不希望重复刷机 206 4.网络文件系统:nfs 207 原因:方便开发板和PC之间的文件共享 208 209 12)配置tftp 210 保证:1.sd卡中有bootloader 211 2.开发板和电脑链接:串口线 网线 212 3.启动minicom 213 4.启动开发板,在minicom中显示uboot的终端 214 配置方法参考<www.embsky.com> 215 216 13)nfs 网络文件 217 开发板的根是PC的一个目录,在开发内核驱动和应用程序的时候非常方便 218 219 220 14)arm架构和arm汇编 221 arm 先进的精简指令集(RISC)处理器 222 x86 51 CISC 223 224 SOC=arm+总线+控制器+... 225 226 参考/home/zyli/6818/s5p6818sdk_lzy1/extern/ARM架构手册.pdf P42 227 经典处理器有七种工作模式 228 1.用户模式 user 10000 执行用户态进程 229 2.系统模式 system Linux系统不用 230 3.管理模式 svc 10011 uboot/Linux内核 231 4.中断模式 irq 10010 处理中断 232 5.快速中断 irq 处理快速中断(默认Linux不启动) 233 6.中止模式 abt 处理内存非法访问 234 7.未定义 unde 处理未定义指令 235 236 8.虚拟化模式 237 9.安全模式 238 239 模式1是普通模式 240 模式2-模式7是特权模式 241 模式3-模式7是异常模式 242 243 有个寄存器CPSR[4:0]用来决定和表示当前的模式 244 只有特权模式才能写CPSR[4:0] 245 246 系统调用 open 247 软件:用户态<--->内核态 248 硬件:user模式<--->管理模式 249 | 250 软中断 swi/svc 251 arm平台的所有系统调用都是基于swi/svc指令的 252 253 重启/开机 reset异常 -----> 管理模式 254 触摸屏/TIMER 中断异常 -----> 中断(快速中断)模式 255 未定义指令 未定义异常 ----> 未定义模式 256 访问非法内存 中止异常 -----> 中止模式 257 执行进程 进程调度 -----> 用户模式 258 259 260 ARM=Arm_Core+TCM+Cache+协处理器+ MMU + ......... 261 | | | |-协助处理器 |-虚拟地址到物理地址的转换 262 | | | |-CP15 CP14 CP11 CP10 263 | | |-控制器(把数据缓存到cache或者刷cache) 264 | | |-I-cache D-cache 265 | |-内存 266 |-执行代码 267 |-寄存器r0,r1,...,r15 268 269 270 架构: 271 冯诺依曼架构 arm7 8086 272 指令和数据不分离 273 哈佛架构 arm9 ..... 274 指令和数据分开存储 275 流水线: 276 取指 把指令从内存取到cpu 277 译码 翻译执行 278 执行 执行指令 279 280 7------------- 281 6------------- 282 5------------- 283 4------------- 284 3------------- 取指 285 2------------- 取指 译码 286 1------------- 取指 译码 执行 287 288 寄存器:R0-r15 289 R0-r12 290 291 R13 SP stack pointer 栈 292 R14 LR link register 函数返回地址 293 R15 PC process counter 正在被取指的指令 294 PC指向正在被取指的指令的下下条指令 295 296 15)arm汇编 297 arm指令集 32位 298 thumb指令集 16位 299 thumb2指令集 16/32位 300 301 arm-cortex-m thumb2 302 arm-cortex-a arm 303 304 <参考arm汇编常用指令.pdf> 305 306 16)安装交叉编译器 307 [extern]$ tar -xvf arm-linux-gcc-4.5.1.tar.bz2 308 [bin]$ vim ~/.bashrc 309 最后一行添加如下: 310 PATH=/home/zyli/6818/s5p6818sdk_lzy1/extern/4.5.1/bin:$PATH 311 [bin]$ source ~/.bashrc 312 313 17)arm汇编指令 314 mov 寄存器,寄存器/立即数 315 mov r0, r1 //r0=r1 316 mov r0, #20 //r0=20 317 318 add 寄存器1,寄存器2,寄存器3/立即数 319 寄存器1=寄存器2+寄存器3/立即数 320 sub 寄存器1,寄存器2,寄存器3/立即数 321 寄存器1=寄存器2-寄存器3/立即数 322 mul 寄存器1,寄存器2,寄存器3 323 寄存器1=寄存器2*寄存器3 324 div 寄存器1, 寄存器2, 寄存器3 325 寄存器1=寄存器2/寄存器3 326 adc 寄存器1,寄存器2,寄存器3/立即数 327 寄存器1=寄存器2+寄存器3/立即数+CPSR_C(进位) 328 sbc 寄存器1,寄存器2,寄存器3/立即数 329 寄存器1=寄存器2-寄存器3/立即数-!CPSR_C(借位) 330 331 伪指令: ldr 寄存器,=数字 332 寄存器=数字 333 334 335 336 注意:表脚指令不需要+s就能影响CPSR的标志位 337 cmp 寄存器,寄存器1/立即数 寄存器-寄存器1/立即数---->CPSR_NZ 338 条件执行: eq ne lt gt ge le 339 340 teq 寄存器,寄存器1/立即数 341 寄存器^寄存器1/立即数 342 343 位 & | ^ ~ 344 and 寄存器,寄存器1,寄存器/立即数 345 寄存器=寄存器1 & 寄存器/立即数 346 orr 寄存器,寄存器1,寄存器/立即数 347 寄存器=寄存器1 | 寄存器/立即数 348 eor 寄存器,寄存器1,寄存器/立即数 349 寄存器=寄存器1 ^ 寄存器/立即数 350 mvn 寄存器,寄存器/立即数 351 寄存器=~寄存器/立即数 352 353 >> << 354 mov 寄存器, 寄存器1, lsl 寄存器2/立即数 355 寄存器 = 寄存器1 << 寄存器2/立即数 356 去掉高位,低位补0 357 mov 寄存器, 寄存器1, lsr 寄存器2/立即数 358 寄存器 = 寄存器1 >>> 寄存器2/立即数 359 去掉低位,高位补0 360 mov 寄存器, 寄存器1, asr 寄存器2/立即数 361 寄存器 = 寄存器1 >> 寄存器2/立即数 362 去掉低位,高位补符号位 363 mov 寄存器, 寄存器1, ror 寄存器2/立即数 364 寄存器 = 寄存器1 <<>> 寄存器2/立即数 365 去掉低位,补到高位 366 367 bic 寄存器1,寄存器2,寄存器3/立即数 368 寄存器1 = 寄存器2 & ~寄存器3/立即数 369 370 练习: 371 //ledcon = ledcon | (1 << 3) 372 ledcon |= 1 << 3 373 伪码: 374 mov r0, #1 375 //orr %0, %0, r0, lsl #3 376 orr %0, r0, lsl #3 377 378 ledcon &= ~(1 << 3) 379 伪码: 380 mov r0, #1 381 mvn r1, r0, lsl #3 382 and %0, r1 383 384 bic %0, %0, #(1 << 3) 385 %0=%0&~(1 << 3) 386 387 388 swi/svc 389 系统调用 390 char *s = "helloworld "; 391 write(1, s, strlen(s)); 392 393 write的实现: 394 syscall(4, 1, s, strlen(s)); 395 syscall的实现: 396 mov r0, #1 397 mov r1, %0 398 mov r2, #11 399 mov r7, #4 400 swi 100---------->进入内核,内核获取r7的值,根据r7的值在系统调用表中找到对应的系统调用 401 402 403 ldr 把数据从内存加载到寄存器 404 str 把数据从寄存器放到内存 405 406 407 ldr 寄存器,地址 寄存器=*地址 408 str 寄存器,地址 *地址=寄存器 409 410 mov 寄存器, 寄存器/立即数(地址) 411 ldr 寄存器1, [寄存器] 寄存器1=*寄存器 412 str 寄存器1, [寄存器] *寄存器=寄存器1 413 414 ldr 寄存器1, [寄存器, #4] 寄存器1=*(寄存器+4) 415 ldr 寄存器1, [寄存器, #4]! 寄存器+=4 寄存器1=*寄存器 416 417 ldr 寄存器1, [寄存器], #4 寄存器1=*寄存器 寄存器+=4 418 str 寄存器1, [寄存器], #4 *寄存器=寄存器1 寄存器+=4 419 420 421 b 标号(地址) 422 bl 标号(地址) 在跳转之前会把下一条指令的地址存放到LR(R14) 423 bx 寄存器 424 425 汇编综合练习(代码分析) 426 1.函数调用 427 2.a++ + ++a + a++ + ++a ..... 428 429 总结: 430 1.嵌入式基础 431 2.刷机(产品发布) 432 3.tftp(下载内核) nfs(挂在网络文件系统) (开发) 433 4.arm架构 arm汇编 (了解) 434 435 18)SOC裸板开发(不基于操作系统) 436 目的:熟悉板子 437 GPIO 通用的输入输出口 438 管脚----------输入 输出 其他 439 输出:控制 SOC---------LED--R--VCC 440 输入:检测 SOC---------Sensor 441 其他:串口等 SOC---------> 442 443 推挽输出(能高能低) 444 445 S5P6818一共有160个管脚为GPIO 分为5组 每组32个 446 SOC:Arm--->GPIO控制器(每一组io一个控制器)----->IO管脚 447 |-寄存器(地址) SFR 448 449 具体寄存器参考S5P6816的datasheet 450 GPIOXOUT[31:0] 451 控制管脚电平的高低(输出) 452 453 GPIOXOUTENB[31:0] 454 决定GPIO功能 455 456 GPIOXPAD[31:0] 457 检测管脚状态(输入) 458 459 GPIOx_PULLSEL[31:0] 460 选择上拉或者下拉电阻 461 462 GPIOx_PULLSEL_DISABLE_DEFAULT[31:0] 463 上拉电阻和下拉电阻的默认选择 464 465 GPIOx_PULLENB[31:0] 466 选择是否需要上拉或者下拉电阻 467 468 GPIOx_PULLENB_DISABLE_DEFAULT[31:0] 469 上拉/下拉电阻的使能/禁止的默认选择 470 471 . 472 ├── inc 473 │ ├── common.h 474 │ ├── hw.h 475 │ └── lib.h 476 ├── Makefile 477 ├── ReadMe.txt 478 └── src 479 ├── hw.c 480 ├── lib.c 481 ├── main.c 482 ├── Makefile 483 └── start.s 484 485 arm-linux-gcc main.c -c -o main.o -I ../inc 486 arm-linux-gcc hw.c -c -o hw.o -I ../inc 487 arm-linux-gcc lib.c -c -o lib.o -I ../inc 488 arm-linux-as start.s -o start.o 489 arm-linux-ld start.o main.o lib.o hw.o -o arm -Ttext 0x50000000 490 arm-linux-objcopy -O binary arm arm.bin 491 492 借用Uboot的printf 493 调用函数:1.通过名字调用 494 2.通过函数指针(地址) 495 496 Uboot在内存的0x43c00000运行:在Uboot的System.map文件中能够看到Uboot中多有函数的地址 497 498 printf--->标准输出---->终端 499 开发板的终端设备是串口 500 501 UART 502 S5P6818 的串口是3.3v 503 504 ttl/232/485 505 ttl:3.3V/5V------->1 506 0V------------>0 507 232: -3v -12v----->1 508 3v 12v----->0 509 485: 模拟 差分信号 510 511 512 ttl/232 513 ---->>>>------------------------------ 514 ----<<<<------------------------------ 515 516 485/usb/eth 517 ----->>>>>-------------------------------- 518 ----->>>>>-------------------------------- 519 520 ttl<--max232-->232 521 ttl<--max485-->485 522 523 115200 8N1 524 525 串口配置流程: 526 1.GPIO其他功能 527 2.数据格式8N1 528 3.关闭FIFO 529 [UTXH] FIFO---------------------------> 530 [URXH] FIFO<--------------------------- 531 4.关掉AFC 532 5.波特率115200 533 534 6.发送数据 535 7.接收数据 536 537 19)Linux内核驱动 538 查看Linux内核 539 ctags 540 1.解压内核源码 541 tar -xvf linux-3.4.tar.bz2 542 2.进入内核 543 cd kernel 544 3.创建索引 545 ctags -R . 546 547 查看: 548 vim -t memcpy 549 :cstag memcpy 550 ctrl+] 551 ctrl+o 552 553 在内核中添加自己的代码 554 cd kernel-3.4 555 mkdir drivers/zmb 556 touch drivers/zmb/test.c 557 touch drivers/zmb/Makefile 558 vim drivers/Makefile 559 obj-y += zmb/ 560 vim drivers/zmb/Makefile 561 obj-y += test.o 562 vim drivers/zmb/test.c 563 内容参考具体文件 564 make 565 make uImage 566 567 接下来启动内核,在启动过程中观察我们自己的代码启动 568 569 在内核中添加自己的配置选项 570 make menuconfig ------> 提供一个配置界面(用来做内核裁剪) 571 例子1:通过make menconfig来配置test.c是否要编译到内核 572 touch drivers/zmb/Kconfig 573 vim drviers/zmb/Kconfig 574 config MY_TEST 575 bool "My Test Support" 576 default n 577 help 578 If you select this you will be happy 579 vim drivers/Kconfig 580 source "drivers/zmb/Kconfig" 581 582 插曲: 583 ################################################################## 584 ###Kconfig--->make menuconfig--->[*]/[]----->.config ### 585 ### | |-CONFIG_MY_TEST=n ### 586 ### |-CONFIG_MY_TEST=y ### 587 ###--->make-->include/generated/autoconf.h --->提供给C文件使用### 588 ### |-#define CONFIG_MY_TEST 1 ### 589 ### -->include/config/auto.conf -------->提供给Makefile使用### 590 ### |-CONFIG_MY_TEST=y ### 591 ################################################################## 592 593 vim drivers/zmb/Makefile 594 obj-$(CONFIG_MY_TEST) += test.o 595 make 596 make uImage 597 598 接下来启动内核,在启动过程中观察我们自己的代码启动 599 600 例子2:能够控制条件编译的选项 601 touch drivers/zmb/test1.c 602 参考具体文件 603 vim drivers/zmb/Makefile 604 obj-$(CONFIG_MY_TEST1) += test1.o 605 vim drivers/zmb/Kconfig 606 config MY_TEST1 607 bool "MY TEST1 Support" 608 default n 609 help 610 If you ........ 611 612 config FUN_ENABLE 613 bool "FUN_ENABLE Support" 614 depends on MY_TEST1 615 default n 616 help 617 If you ...... 618 make menuconfig 619 make 620 make uImage 621 622 接下来启动内核,在启动过程中观察我们自己的代码启动 623 注意:如果printk的消息级别不够的化,printk打印的东西会放到缓存而不会显示到终端 624 注意:查看缓存的命令dmesg 625 626 例子3:目录型选项 627 cp drivers/zmb/Kconfig drivers/zmb/Kconfig.bak 628 vim drivers/zmb/Kconfig 629 在开头加menu "xxxxxxx" 630 在结尾加endmenu 631 632 例子4:能够控制的目录型选项 633 cp drivers/zmb/Kconfig drivers/zmb/Kconfig.bak1 634 vim drivers/zmb/Kconfig 635 参考具体文件 636 vim drivers/Makefile 637 obj-$(CONFIG_ZMB_TEST) += zmb/ 638 639 例子5: 640 vim drivers/zmb/test1.c 641 在test_init函数中添加: 642 for (i = 0; i < CONFIG_PRINTK_COUNT; i++) 643 printk("%s ", CONFIG_PRINTK_CONTENT); 644 vim drivers/zmb/Kconfig 645 if MY_TEST1 646 config PRINTK_COUNT 647 int "printk count" 648 default 5 649 range 0 100 650 help 651 If ..... 652 config PRINTK_CONTENT 653 string "printk content" 654 default "I am Kernel" 655 help 656 If ..... 657 endif 658 659 例子6:多选一 660 vim drivers/zmb/Kconfig 661 choice 662 prompt "select you ts type" 663 config MY_TS1 664 bool "my ts1" 665 config MY_TS2 666 bool "my ts2" 667 config MY_TS3 668 bool "my ts3" 669 endchoice 670 671 要求:根据选择的不同代码在启动的时候要打印不同的信息 672 673 代码参考<code>/kernel/01code_in_kernel 674 675 总结:把代码编译到内核 有点:方便 缺点:修改代码后要重新编译内核和升级内核 676 677 内核模块 678 可以把内核代码写成模块 679 模块可以在内核启动之后动态安装或者卸载 680 注意:1.编译内核模块需要用到编译通过的内核源码 681 2.在板子中运行的内核和编译模块的内核必须由同一套内核来编译 682 683 insmod 内核模块.ko 684 rmmod 内核模块.ko 685 lsmod 用来查看当前内核中的模块 686 687 代码参考<code>/kernel/02module 688 689 字符设备 690 代码参考<code>/kernel/03cdev 691 692 693 app:系统调用 open close ioctl read write select poll .... 694 /dev/led /dev/wdt 695 ------------------------------------------------------ 696 kernel: 697 led_driver wdt_driver ...... 698 ------------------------------------------------------ 699 SOC:寄存器 700 led wdt uart lcd ts net wifi iic spi eeprom .... 701 702 字符设备------>lcd led ts uart wdt adc eeprom ...... 703 块设备-------->sd卡 硬盘 emmc nand ...... 704 网络设备------>网卡 705 706 复习:fd = open("/dev/led", O_RDWR) 707 struct data_st { 708 int no 709 int on; 710 }led; 711 led.no = 1; 712 led.on = 1; 713 write(fd, &led, sizeof(led)); 714 715 字符设备 716 设备号:主设备号+次设备 717 cat /proc/devices 718 719 open close read write ioctl 720 721 /dev/mydevice /dev/myhehe 722 |-15:1 |-15:2 723 -------------------------------------------------- 724 kernel 725 <--->cdev<-->cdev<--->cdev<--->cdev<---> 726 |-dev设备号15:1 727 |-count数量 3 728 |-ops--->file_operations 729 .open----------------->my_open 730 .release-------------->my_release 731 .write---------------->my_write 732 .read----------------->my_read 733 .unlocked_ioctl------->my_ioctl 734 --------------------------------------- 735 hardware 736 737 struct cdev 738 739 20)项目
1 周末班上课笔记 2 1.从redhat centos过度到ubuntu 3 a)修改网络配置 4 b)ubuntu安装 5 建议在安装ubuntu的过程中断网 6 分区: 7 建议分3个区 8 1.home分区 100G----->/home 9 2.交换分区 8G 10 3.根分区 30G------>/ 11 c)软件管理 12 centos redhat --->yum rpm 13 ubuntu----------->apt dpkg 14 d)用户 15 建议:在ubuntu下建议不要使用root 16 如果想要root权限,只需要在执行命令的时候加sudo 17 sudo apt-get install minicom 18 e)新装的ubuntu系统需要更新系统 19 sudo apt-get update 20 f)新装的ubuntu系统需要安装的软件包 21 www.embsky.com 22 在站内搜索:ubuntu----><新装ubuntu系统需要安装的包> 23 g)unity gnome2 gnome3 24 sudo apt-get install gnome 25 26 2.嵌入式系统分类 27 无操作系统 28 单片机 29 带操作系统 30 单片机--->ucos 31 SOC------>linux/Android/win 32 33 3.arm历史 34 官网:www.arm.com 35 arm公司不做芯片,只设计处理器架构 36 arm1 arm2 arm3 ..... arm6 37 半导体公司:ST TI 三星 NXP 高通 ADI 38 华为 小米 联发科 全志 龙芯 .......... 39 cpu SOC = cpu+控制器+总线 40 经典处理器: 41 arm7--------->S3C44B0 42 arm9--------->S3C2410/S3C2440 43 arm11-------->S3C6410 44 45 cortex系列处理器: 46 arm-cortex-a 47 application 48 a8 S5PV210 单核 三星 49 Am335 单核 TI 50 a9 51 Exynos4412 4核 52 Omap4460 2核 53 Imax6Q 4核 54 Imax6D 2核 55 S5P4418 4核 56 a15 57 Exynos5210 58 a53 59 64位 60 S5P6818 8核 61 a72 62 64位 63 arm-cortex-m 64 mcu 65 m3 stm32f103 66 m4 stm32f407 67 arm-cortex-r 68 realtime 69 r4/r6 70 71 4)开发板sdk下载 72 a)从教师及ftp下载 73 b)从www.embsky.com下载 74 c)解压sdk 75 tar -xvf s5p6818sdk_lzy1.tar.bz2 -C /var/ftp/embsky/source/zmb/ 76 77 5)嵌入式软件架构 78 79 app 80 游戏 软件 桌面 ..... 81 文件系统 buildroot 82 文件管理 83 kernel linux/Android 84 进程管理 内存管理 文件系统 网络设备 设备驱动 85 bootloader uboot 86 初始化硬件 引导内核 87 ----------------------------------------------------- 88 arm---->SOC+lcd+soud+net+ts+sensor...... 89 mips 90 ppc 91 92 6)开发方式 93 第一手开发---->原厂 94 第二手开发---->做开发板 95 第三手开发---->项目 96 97 7)Android系统和Linux系统 98 Android: 99 emmc{bootloader uImage ramdisk [system][data][cache][storage]} 100 bootloader--->uImage--->ramdisk / 101 /system 挂载system分区 102 /data 挂载data分区 103 /cache 挂载cache分区 104 /storage 挂载storage分区 105 Linux: 106 emmc{bootloader uImage [rootfs]} 107 108 8)搭建嵌入式开发环境之刷Linux系统 109 a)制作刷机sd卡 /dev/sdb2 110 sd{ 80M(uboot) [ ] [ ]} 111 /dev/sdb /dev/sdb1 112 bootloader 513字节 113 芯片要求 114 S5P6818--->rom---->513 115 <详细内容请查看视频> 116 117 b)把uboot烧写到sd卡 118 sudo dd if=ubootpak.bin of=/dev/sdb seek=1 119 sync 120 121 c)配置minicom 122 作用:能够操作PC的串口 123 115200 8N1 124 125 d)刷机 Linux 126 emmc{ubootpak.bin [boot.img][rootfs.ext2][][][][][]} 127 /dev/mmcblk0 128 /dev/mmcblk0p1 129 /dev/mmcblk0p2 130 bootloader--->uImage---->rootfs 131 132 e)修改uboot环境变量 133 倒数3秒 134 [zyli@Uboot]# set bootcmd "ext4load mmc 2:1 0x48000000 uImage;bootm 0x48000000" 135 [zyli@Uboot]# set bootargs root=/dev/mmcblk0p2 tp=gslx680-linux 136 [zyli@Uboot]# save 137 拔出sd卡 138 f)重启开发板 139 [zyli@Uboot]# reset 140 相关内容请查看:<minicom配置.mp4> <刷机(linux).mp4> <制作sd卡分区.mp4> 141 142 soc+ddr(1G)+emmc(8) 143 socs5p6818支持3中启动方式:1.sd卡 2.emmc 3.usb 144 sd卡中的bootloader运行:bootloader提供一个命令fastboot 145 146 9)搭建嵌入式开发环境之刷Android系统 147 相关内容请查看:<刷机Android.mp4> 148 149 10)编译嵌入式系统ROM(Linux) 150 a)bootloader 151 相关内容请查看:<编译uboot.mp4> 152 b)kernel 153 tar -xvf linux-3.4.tar.bz2 154 cd kernel 155 vim Makefile 156 CROSS_COMPILE= 157 make x6818_defconfig 158 make menuconfig 159 make -j4 160 make uImage 161 162 编译完成的内核在<linux_src>/arch/arm/boot/uImage 163 接下来要把uImage打包到boot.img中 164 tar -xvf boot.tar.bz2 165 cp ../src/kernel/arch/arm/boot/uImage boot/ 166 ./make_ext4fs -s -l 64M -L linux boot.img ./boot 167 168 c)rootfs 169 / 170 [------------------[/bin /sbin /usr/bin /usr/sbin /etc /dev /var ..../root /home/xxx]] 171 busybox工具集 172 mplayer 173 mpg123 174 qt库 175 sqlite 176 mysql 177 python 178 179 buildroot 工具 180 ----->rootfs 181 182 tar -xvf buildroot.tar.bz2 183 cd buildroot 184 make x6818_defconfig 185 make -j4 186 187 编译过程中ncruse出错 188 vim output/build/host-ncurses-5.9/include/curses.tail 189 删掉/* generate */ 190 make -j4 191 192 11)bootloader kernel rootfs运行方式 193 刷机: bootloader kernel rootfs----->都在emmc 194 195 开发: 196 booloader--->sd卡 197 kernel------>在PC,由bootloader通过网络下载到板子的内存 198 rootfs------>在PC,板子的内核启动后通过nfs挂在根文件系统 199 200 总结: 201 1.理论基础:嵌入式 物联网 Android/Linux arm/SOC 202 2.刷机:Linux/Android 203 原因:产品 204 3.下载内核:tftp 205 原因:开发阶段不希望重复刷机 206 4.网络文件系统:nfs 207 原因:方便开发板和PC之间的文件共享 208 209 12)配置tftp 210 保证:1.sd卡中有bootloader 211 2.开发板和电脑链接:串口线 网线 212 3.启动minicom 213 4.启动开发板,在minicom中显示uboot的终端 214 配置方法参考<www.embsky.com> 215 216 13)nfs 网络文件 217 开发板的根是PC的一个目录,在开发内核驱动和应用程序的时候非常方便 218 219 220 14)arm架构和arm汇编 221 arm 先进的精简指令集(RISC)处理器 222 x86 51 CISC 223 224 SOC=arm+总线+控制器+... 225 226 参考/home/zyli/6818/s5p6818sdk_lzy1/extern/ARM架构手册.pdf P42 227 经典处理器有七种工作模式 228 1.用户模式 user 10000 执行用户态进程 229 2.系统模式 system Linux系统不用 230 3.管理模式 svc 10011 uboot/Linux内核 231 4.中断模式 irq 10010 处理中断 232 5.快速中断 irq 处理快速中断(默认Linux不启动) 233 6.中止模式 abt 处理内存非法访问 234 7.未定义 unde 处理未定义指令 235 236 8.虚拟化模式 237 9.安全模式 238 239 模式1是普通模式 240 模式2-模式7是特权模式 241 模式3-模式7是异常模式 242 243 有个寄存器CPSR[4:0]用来决定和表示当前的模式 244 只有特权模式才能写CPSR[4:0] 245 246 系统调用 open 247 软件:用户态<--->内核态 248 硬件:user模式<--->管理模式 249 | 250 软中断 swi/svc 251 arm平台的所有系统调用都是基于swi/svc指令的 252 253 重启/开机 reset异常 -----> 管理模式 254 触摸屏/TIMER 中断异常 -----> 中断(快速中断)模式 255 未定义指令 未定义异常 ----> 未定义模式 256 访问非法内存 中止异常 -----> 中止模式 257 执行进程 进程调度 -----> 用户模式 258 259 260 ARM=Arm_Core+TCM+Cache+协处理器+ MMU + ......... 261 | | | |-协助处理器 |-虚拟地址到物理地址的转换 262 | | | |-CP15 CP14 CP11 CP10 263 | | |-控制器(把数据缓存到cache或者刷cache) 264 | | |-I-cache D-cache 265 | |-内存 266 |-执行代码 267 |-寄存器r0,r1,...,r15 268 269 270 架构: 271 冯诺依曼架构 arm7 8086 272 指令和数据不分离 273 哈佛架构 arm9 ..... 274 指令和数据分开存储 275 流水线: 276 取指 把指令从内存取到cpu 277 译码 翻译执行 278 执行 执行指令 279 280 7------------- 281 6------------- 282 5------------- 283 4------------- 284 3------------- 取指 285 2------------- 取指 译码 286 1------------- 取指 译码 执行 287 288 寄存器:R0-r15 289 R0-r12 290 291 R13 SP stack pointer 栈 292 R14 LR link register 函数返回地址 293 R15 PC process counter 正在被取指的指令 294 PC指向正在被取指的指令的下下条指令 295 296 15)arm汇编 297 arm指令集 32位 298 thumb指令集 16位 299 thumb2指令集 16/32位 300 301 arm-cortex-m thumb2 302 arm-cortex-a arm 303 304 <参考arm汇编常用指令.pdf> 305 306 16)安装交叉编译器 307 [extern]$ tar -xvf arm-linux-gcc-4.5.1.tar.bz2 308 [bin]$ vim ~/.bashrc 309 最后一行添加如下: 310 PATH=/home/zyli/6818/s5p6818sdk_lzy1/extern/4.5.1/bin:$PATH 311 [bin]$ source ~/.bashrc 312 313 17)arm汇编指令 314 mov 寄存器,寄存器/立即数 315 mov r0, r1 //r0=r1 316 mov r0, #20 //r0=20 317 318 add 寄存器1,寄存器2,寄存器3/立即数 319 寄存器1=寄存器2+寄存器3/立即数 320 sub 寄存器1,寄存器2,寄存器3/立即数 321 寄存器1=寄存器2-寄存器3/立即数 322 mul 寄存器1,寄存器2,寄存器3 323 寄存器1=寄存器2*寄存器3 324 div 寄存器1, 寄存器2, 寄存器3 325 寄存器1=寄存器2/寄存器3 326 adc 寄存器1,寄存器2,寄存器3/立即数 327 寄存器1=寄存器2+寄存器3/立即数+CPSR_C(进位) 328 sbc 寄存器1,寄存器2,寄存器3/立即数 329 寄存器1=寄存器2-寄存器3/立即数-!CPSR_C(借位) 330 331 伪指令: ldr 寄存器,=数字 332 寄存器=数字 333 334 335 336 注意:表脚指令不需要+s就能影响CPSR的标志位 337 cmp 寄存器,寄存器1/立即数 寄存器-寄存器1/立即数---->CPSR_NZ 338 条件执行: eq ne lt gt ge le 339 340 teq 寄存器,寄存器1/立即数 341 寄存器^寄存器1/立即数 342 343 位 & | ^ ~ 344 and 寄存器,寄存器1,寄存器/立即数 345 寄存器=寄存器1 & 寄存器/立即数 346 orr 寄存器,寄存器1,寄存器/立即数 347 寄存器=寄存器1 | 寄存器/立即数 348 eor 寄存器,寄存器1,寄存器/立即数 349 寄存器=寄存器1 ^ 寄存器/立即数 350 mvn 寄存器,寄存器/立即数 351 寄存器=~寄存器/立即数 352 353 >> << 354 mov 寄存器, 寄存器1, lsl 寄存器2/立即数 355 寄存器 = 寄存器1 << 寄存器2/立即数 356 去掉高位,低位补0 357 mov 寄存器, 寄存器1, lsr 寄存器2/立即数 358 寄存器 = 寄存器1 >>> 寄存器2/立即数 359 去掉低位,高位补0 360 mov 寄存器, 寄存器1, asr 寄存器2/立即数 361 寄存器 = 寄存器1 >> 寄存器2/立即数 362 去掉低位,高位补符号位 363 mov 寄存器, 寄存器1, ror 寄存器2/立即数 364 寄存器 = 寄存器1 <<>> 寄存器2/立即数 365 去掉低位,补到高位 366 367 bic 寄存器1,寄存器2,寄存器3/立即数 368 寄存器1 = 寄存器2 & ~寄存器3/立即数 369 370 练习: 371 //ledcon = ledcon | (1 << 3) 372 ledcon |= 1 << 3 373 伪码: 374 mov r0, #1 375 //orr %0, %0, r0, lsl #3 376 orr %0, r0, lsl #3 377 378 ledcon &= ~(1 << 3) 379 伪码: 380 mov r0, #1 381 mvn r1, r0, lsl #3 382 and %0, r1 383 384 bic %0, %0, #(1 << 3) 385 %0=%0&~(1 << 3) 386 387 388 swi/svc 389 系统调用 390 char *s = "helloworld "; 391 write(1, s, strlen(s)); 392 393 write的实现: 394 syscall(4, 1, s, strlen(s)); 395 syscall的实现: 396 mov r0, #1 397 mov r1, %0 398 mov r2, #11 399 mov r7, #4 400 swi 100---------->进入内核,内核获取r7的值,根据r7的值在系统调用表中找到对应的系统调用 401 402 403 ldr 把数据从内存加载到寄存器 404 str 把数据从寄存器放到内存 405 406 407 ldr 寄存器,地址 寄存器=*地址 408 str 寄存器,地址 *地址=寄存器 409 410 mov 寄存器, 寄存器/立即数(地址) 411 ldr 寄存器1, [寄存器] 寄存器1=*寄存器 412 str 寄存器1, [寄存器] *寄存器=寄存器1 413 414 ldr 寄存器1, [寄存器, #4] 寄存器1=*(寄存器+4) 415 ldr 寄存器1, [寄存器, #4]! 寄存器+=4 寄存器1=*寄存器 416 417 ldr 寄存器1, [寄存器], #4 寄存器1=*寄存器 寄存器+=4 418 str 寄存器1, [寄存器], #4 *寄存器=寄存器1 寄存器+=4 419 420 421 b 标号(地址) 422 bl 标号(地址) 在跳转之前会把下一条指令的地址存放到LR(R14) 423 bx 寄存器 424 425 汇编综合练习(代码分析) 426 1.函数调用 427 2.a++ + ++a + a++ + ++a ..... 428 429 总结: 430 1.嵌入式基础 431 2.刷机(产品发布) 432 3.tftp(下载内核) nfs(挂在网络文件系统) (开发) 433 4.arm架构 arm汇编 (了解) 434 435 18)SOC裸板开发(不基于操作系统) 436 目的:熟悉板子 437 GPIO 通用的输入输出口 438 管脚----------输入 输出 其他 439 输出:控制 SOC---------LED--R--VCC 440 输入:检测 SOC---------Sensor 441 其他:串口等 SOC---------> 442 443 推挽输出(能高能低) 444 445 S5P6818一共有160个管脚为GPIO 分为5组 每组32个 446 SOC:Arm--->GPIO控制器(每一组io一个控制器)----->IO管脚 447 |-寄存器(地址) SFR 448 449 具体寄存器参考S5P6816的datasheet 450 GPIOXOUT[31:0] 451 控制管脚电平的高低(输出) 452 453 GPIOXOUTENB[31:0] 454 决定GPIO功能 455 456 GPIOXPAD[31:0] 457 检测管脚状态(输入) 458 459 GPIOx_PULLSEL[31:0] 460 选择上拉或者下拉电阻 461 462 GPIOx_PULLSEL_DISABLE_DEFAULT[31:0] 463 上拉电阻和下拉电阻的默认选择 464 465 GPIOx_PULLENB[31:0] 466 选择是否需要上拉或者下拉电阻 467 468 GPIOx_PULLENB_DISABLE_DEFAULT[31:0] 469 上拉/下拉电阻的使能/禁止的默认选择 470 471 . 472 ├── inc 473 │ ├── common.h 474 │ ├── hw.h 475 │ └── lib.h 476 ├── Makefile 477 ├── ReadMe.txt 478 └── src 479 ├── hw.c 480 ├── lib.c 481 ├── main.c 482 ├── Makefile 483 └── start.s 484 485 arm-linux-gcc main.c -c -o main.o -I ../inc 486 arm-linux-gcc hw.c -c -o hw.o -I ../inc 487 arm-linux-gcc lib.c -c -o lib.o -I ../inc 488 arm-linux-as start.s -o start.o 489 arm-linux-ld start.o main.o lib.o hw.o -o arm -Ttext 0x50000000 490 arm-linux-objcopy -O binary arm arm.bin 491 492 借用Uboot的printf 493 调用函数:1.通过名字调用 494 2.通过函数指针(地址) 495 496 Uboot在内存的0x43c00000运行:在Uboot的System.map文件中能够看到Uboot中多有函数的地址 497 498 printf--->标准输出---->终端 499 开发板的终端设备是串口 500 501 UART 502 S5P6818 的串口是3.3v 503 504 ttl/232/485 505 ttl:3.3V/5V------->1 506 0V------------>0 507 232: -3v -12v----->1 508 3v 12v----->0 509 485: 模拟 差分信号 510 511 512 ttl/232 513 ---->>>>------------------------------ 514 ----<<<<------------------------------ 515 516 485/usb/eth 517 ----->>>>>-------------------------------- 518 ----->>>>>-------------------------------- 519 520 ttl<--max232-->232 521 ttl<--max485-->485 522 523 115200 8N1 524 525 串口配置流程: 526 1.GPIO其他功能 527 2.数据格式8N1 528 3.关闭FIFO 529 [UTXH] FIFO---------------------------> 530 [URXH] FIFO<--------------------------- 531 4.关掉AFC 532 5.波特率115200 533 534 6.发送数据 535 7.接收数据 536 537 19)Linux内核驱动 538 查看Linux内核 539 ctags 540 1.解压内核源码 541 tar -xvf linux-3.4.tar.bz2 542 2.进入内核 543 cd kernel 544 3.创建索引 545 ctags -R . 546 547 查看: 548 vim -t memcpy 549 :cstag memcpy 550 ctrl+] 551 ctrl+o 552 553 在内核中添加自己的代码 554 cd kernel-3.4 555 mkdir drivers/zmb 556 touch drivers/zmb/test.c 557 touch drivers/zmb/Makefile 558 vim drivers/Makefile 559 obj-y += zmb/ 560 vim drivers/zmb/Makefile 561 obj-y += test.o 562 vim drivers/zmb/test.c 563 内容参考具体文件 564 make 565 make uImage 566 567 接下来启动内核,在启动过程中观察我们自己的代码启动 568 569 在内核中添加自己的配置选项 570 make menuconfig ------> 提供一个配置界面(用来做内核裁剪) 571 例子1:通过make menconfig来配置test.c是否要编译到内核 572 touch drivers/zmb/Kconfig 573 vim drviers/zmb/Kconfig 574 config MY_TEST 575 bool "My Test Support" 576 default n 577 help 578 If you select this you will be happy 579 vim drivers/Kconfig 580 source "drivers/zmb/Kconfig" 581 582 插曲: 583 ################################################################## 584 ###Kconfig--->make menuconfig--->[*]/[]----->.config ### 585 ### | |-CONFIG_MY_TEST=n ### 586 ### |-CONFIG_MY_TEST=y ### 587 ###--->make-->include/generated/autoconf.h --->提供给C文件使用### 588 ### |-#define CONFIG_MY_TEST 1 ### 589 ### -->include/config/auto.conf -------->提供给Makefile使用### 590 ### |-CONFIG_MY_TEST=y ### 591 ################################################################## 592 593 vim drivers/zmb/Makefile 594 obj-$(CONFIG_MY_TEST) += test.o 595 make 596 make uImage 597 598 接下来启动内核,在启动过程中观察我们自己的代码启动 599 600 例子2:能够控制条件编译的选项 601 touch drivers/zmb/test1.c 602 参考具体文件 603 vim drivers/zmb/Makefile 604 obj-$(CONFIG_MY_TEST1) += test1.o 605 vim drivers/zmb/Kconfig 606 config MY_TEST1 607 bool "MY TEST1 Support" 608 default n 609 help 610 If you ........ 611 612 config FUN_ENABLE 613 bool "FUN_ENABLE Support" 614 depends on MY_TEST1 615 default n 616 help 617 If you ...... 618 make menuconfig 619 make 620 make uImage 621 622 接下来启动内核,在启动过程中观察我们自己的代码启动 623 注意:如果printk的消息级别不够的化,printk打印的东西会放到缓存而不会显示到终端 624 注意:查看缓存的命令dmesg 625 626 例子3:目录型选项 627 cp drivers/zmb/Kconfig drivers/zmb/Kconfig.bak 628 vim drivers/zmb/Kconfig 629 在开头加menu "xxxxxxx" 630 在结尾加endmenu 631 632 例子4:能够控制的目录型选项 633 cp drivers/zmb/Kconfig drivers/zmb/Kconfig.bak1 634 vim drivers/zmb/Kconfig 635 参考具体文件 636 vim drivers/Makefile 637 obj-$(CONFIG_ZMB_TEST) += zmb/ 638 639 例子5: 640 vim drivers/zmb/test1.c 641 在test_init函数中添加: 642 for (i = 0; i < CONFIG_PRINTK_COUNT; i++) 643 printk("%s ", CONFIG_PRINTK_CONTENT); 644 vim drivers/zmb/Kconfig 645 if MY_TEST1 646 config PRINTK_COUNT 647 int "printk count" 648 default 5 649 range 0 100 650 help 651 If ..... 652 config PRINTK_CONTENT 653 string "printk content" 654 default "I am Kernel" 655 help 656 If ..... 657 endif 658 659 例子6:多选一 660 vim drivers/zmb/Kconfig 661 choice 662 prompt "select you ts type" 663 config MY_TS1 664 bool "my ts1" 665 config MY_TS2 666 bool "my ts2" 667 config MY_TS3 668 bool "my ts3" 669 endchoice 670 671 要求:根据选择的不同代码在启动的时候要打印不同的信息 672 673 代码参考<code>/kernel/01code_in_kernel 674 675 总结:把代码编译到内核 有点:方便 缺点:修改代码后要重新编译内核和升级内核 676 677 内核模块 678 可以把内核代码写成模块 679 模块可以在内核启动之后动态安装或者卸载 680 注意:1.编译内核模块需要用到编译通过的内核源码 681 2.在板子中运行的内核和编译模块的内核必须由同一套内核来编译 682 683 insmod 内核模块.ko 684 rmmod 内核模块.ko 685 lsmod 用来查看当前内核中的模块 686 687 代码参考<code>/kernel/02module 688 689 字符设备 690 代码参考<code>/kernel/03cdev 691 692 693 app:系统调用 open close ioctl read write select poll .... 694 /dev/led /dev/wdt 695 ------------------------------------------------------ 696 kernel: 697 led_driver wdt_driver ...... 698 ------------------------------------------------------ 699 SOC:寄存器 700 led wdt uart lcd ts net wifi iic spi eeprom .... 701 702 字符设备------>lcd led ts uart wdt adc eeprom ...... 703 块设备-------->sd卡 硬盘 emmc nand ...... 704 网络设备------>网卡 705 706 复习:fd = open("/dev/led", O_RDWR) 707 struct data_st { 708 int no 709 int on; 710 }led; 711 led.no = 1; 712 led.on = 1; 713 write(fd, &led, sizeof(led)); 714 715 字符设备 716 设备号:主设备号+次设备 717 cat /proc/devices 718 719 open close read write ioctl 720 721 /dev/mydevice /dev/myhehe 722 |-15:1 |-15:2 723 -------------------------------------------------- 724 kernel 725 <--->cdev<-->cdev<--->cdev<--->cdev<---> 726 |-dev设备号15:1 727 |-count数量 3 728 |-ops--->file_operations 729 .open----------------->my_open 730 .release-------------->my_release 731 .write---------------->my_write 732 .read----------------->my_read 733 .unlocked_ioctl------->my_ioctl 734 --------------------------------------- 735 hardware 736 737 struct cdev 738 739 20)项目