Bài giảng Hệ Thống Nhúng
2013 Bài giảng Hệ Thống Nhúng Đậu Trọng Hiển Trương Ngọc Sơn SPKT Chương GIỚI THIỆU HỆ THỐNG NHÚNG Hệ thống nhúng ( Embedded System): Hiện hệ thống nhúng bước phát triển Việt nam, thay cho hệ thống vi xử lý trước Hệ thống nhúng ứng dụng rộng rãi ngành điện tử, máy tính viễn thơng hệ thống điện thoại, máy đo, hệ thống điều khiển tự động công nghiệp, thương mại ngân hàng Tuy nhiên chưa có định nghĩa cụ thể hệ thống nhúng Thơng qua q trình vận hành, xây dựng phát triển hệ thống nhúng hiểu hệ thống nhúng sau: Hệ thống nhúng ứng dụng bao gồm thiết bị lập trình vi xử lý, vi điều khiển hay vi mạch xử lý số Nó hệ thống dựa vi xử lý để thực chức hay dãy chức cụ thể Hệ thống nhúng ứng dụng tích hợp phần cứng phần mềm nhằm phục vụ tốn chun dụng lĩnh vực cơng nghiệp, y tế, quân Một máy tính PC thiết bị có nhiều chức người sử dụng thay đổi chức thông qua việc thêm, xóa phần mềm ứng dụng, hệ thống nhúng thiết kế để phục vụ số chức cụ thể, xác định Chính hệ thống nhúng nhà phát triển tối ưu hóa nhằm giảm thiểu kích thước chi phí sản xuất Các thiết bị cầm tay PDA có đặc điểm giống hệ thống nhúng chúng hệ thống nhúng chúng có nhiều chức Để thay đổi chức hệ thống nhúng thông thường người ta dựa công cụ phát triển công việc chuyên gia phát triển hệ thống nhúng thực thiện Quá trình xây dựng lại chức hệ thống nhúng giống trình thay đổi chức hệ điều hành, thông thường người ta thay đổi, sửa chữa, thêm, xóa trình điều khiển, hoạt động hệ thống sau tiến hành biên dịch lại cho hệ thống nhúng Một hệ thống nhúng kết nối với hệ thống máy chủ để phát triển hệ thống, trình phát triển hệ thống hay lập trình cho hệ thống nhúng thực máy tính có cơng cụ hổ trợ Các kết trình biên dịch như: tập tin ảnh hệ điều hành, tập tin thực thi… nạp xuống hệ thống nhúng thông qua kết nối như: serial, usb, ethernet Hình 1-1 Kết nối trình phát triển hệ thống nhúng Một hệ thống nhúng thơng thường có thành phần sau: - Vi xử lý: thông thường vi xử lý 32 bit, vi xử lý đóng vai trị xử lý trung tâm hệ thống nhúng, ngày với phát triển ngành công nghiệp điện tử, nhiều hãng sản xuất vi xử lý cho đời chip vi xử lý 32 bit với nhiều tính tích hợp phục vụ hệ thống nhúng Renesas với chip họ SH, AMCC với PowerPC, Cirrus Logic với ARM7, ARM9, Atmel… Trang - Bộ nhớ: bao gồm nhớ RAM, EEPROM hay Flash ROM - Các ngoại vi bao gồm giao tiếp IO USB, Ethernet, PCI… Tùy vào mục đích, yêu cầu hệ thống khác mà thiết kế ngoại vi khác nhau, có số ngoại vi chung ethernet, usb, serial Các ngoại vi vừa giao tiếp hệ thống ứng dụng vừa làm nhiệm vụ truyền liệu trình nạp phần mềm cho hệ thống hay gỡ rối hệ thống Phần mềm hệ thống nhúng: Phần mềm chương trình điều khiển hoạt động hệ thống nhúng, số hệ thống nhúng phần mềm gọi hệ điều hành nhúng Nó giống hệ điều hành chạy máy tính chúng nhà phát triển tối ưu cho vận hành hiệu hệ thống có nhớ tốc độ xử lý giới hạn Một số hệ điều hành chạy hệ thống nhúng Linux, QNX, Windows CE… Trong hệ thống nhúng sử dụng hệ điều hành Linux, phần mềm gồm phần sau: Bootloader, uboot, redboot: phần mềm khởi động hệ thống Kernel: Nhân hệ điều hành File system: Hệ thống tập tin Một số hệ thống nhúng quanh ta thiết bị nghe nhìn, thiết bị khoa học kỹ thuật, thiết bị phục vụ đời sống tinh thần… Hình 1-2 Một số hệ thống nhúng Hệ thống thời gian thực (Real-time operating system_ RTOS): Trong toán điều khiển hay bắt gặp thuật ngữ “ Thời gian thực” Thời gian thực thời gian phản ánh cách trung thực xác thời gian hay yêu cầu thời gian hệ thống phải trùng với thời gian thực tế Hệ thống thời gian thực hiểu hoạt động hệ thống phải thỏa mãn tính tiền định Tính tiền định hành vi hệ thống phải thực khung thời gian cho trước hoàn toàn xác định, khung thời gian định đặc điểm yêu cầu hệ thống Thực tế cho thấy hầu hết hệ thống nhúng hệ thống thời gian thực ngược lại hầu hết hệ thống thời gian thực hệ thống nhúng Đặc điểm hệ thống nhúng: Hệ thống nhúng có số đặc điểm sau: - Độ tin cậy cao Trang - Có khả bảo trì nâng cấp - Hiệu thời gian thực - Kích thước, khối lượng nhỏ Các khái niệm sử dụng hệ thống nhúng: 4.1 Quá trình khởi động hệ thống: - Image thực thi chương trình biên dịch cho hệ thống nhúng truyền từ công cụ phát triển hệ thống nhúng (Host) vào hệ thống nhúng (Target) trình gọi “Loading the Image” - Image load hệ thống nhúng thông qua cách sau: Load Image vào nhớ EEPROM hay Flash Download Image trực tiếp lên nhớ SRAM hệ thống nhúng thông qua cổng nối tiếp RS232 hay cổng mạng (ethernet) q trình địi hỏi số trình ứng dụng chạy Host Target Embedded Monitor, Embedded Loader, Target debug… Download Image thơng qua JTAG Hình 1-3 Hệ thống nhúng - Embedded Loader: chương trình nạp vào hệ thống nhúng đầu tiên, Embedded Loader hiểu giống BIOS máy tính Embedded loader có dung lượng nhỏ nên thơng thường nạp vào ROM, hệ thống vi xử lý nhỏ, Loader nạp vào vùng riêng vi xử lý Chương trình Embedded Loader có nhiệm vụ kết nối với Host trình truyền file ảnh (Image) xuống hệ thống nhúng Để truyền liệu Host Target, giao thức truyền xây dựng cho tiện ích chạy Host Embedded Loader Target điều hoạt động theo thông số giao thức Tùy theo nhà sản xuất vi xử lý có Embedded Loader riêng, ví dụ vi xử lý Atmel có Bootstrap uboot, PowerPC sử dụng uboot, Cirrus Logic sử dụng redboot Một số chip vi xử lý khác sử dụng bootloader - Embedded Monitor: phần mềm ứng dụng hệ thống nhúng thông thường cung cấp nhà sản xuất Nó cho phép nhà phát triển hệ thống gỡ rối hệ thống, giống chương trình boot, Embedded Monitor thực thi hệ thống cấp nguồn thực số thao tác hệ thống sau: Trang o Khởi tạo, thiết lập cho thiết bị ngoại vi cổng nối tiếp, định thời chip, số lần làm tươi RAM… o Khởi tạo nhớ hệ thống chuẩn bị cho trình download Image o Khởi tạo chương trình điều khiển ngắt, cài đặt ngắt hệ thống - Embedded Monitor hỗ trợ công cụ giao tiếp người dùng thông qua giao tiếp nối tiếp đến chương trình mơ Thơng thường hỗ trợ lệnh điều khiển sau: o Download Image o Đọc ghi ghi hệ thống o Đọc ghi nhớ hệ thống o Thiết lập xóa break point o Cho phép thực thi lệnh để gở rối hệ thống o Reset reboot hệ thống - Quá trình boot hệ thống: Hình 1-4 Quá trình khởi động hệ thống Hệ điều hành thời gian thực (Real-time Operating System) - Hệ điều hành thời gian thực chương trình lập lịch cho hoạt động hệ thống thi hành xác theo thời gian định trước, quản lý tài nguyên hệ thống cung cấp Trang thiết lập thích hợp cho q trình phát triển mã nguồn hệ thống Mã nguồn hệ thống thay đổi - Trong số ứng dụng, RTOS bao gồm kernel (nhân) Kernel lõi mềm giám sát hệ thống, cung cấp khối logic, giải thuật lập lịch, giải thuật quản lý tài nguyên Mỗi hệ thống thời gian thực có kernel Mỗi hệ thống thời gian thực tổng hợp nhiều module bao gồm kernel, file system, network protocol stack, module khác tùy thuộc vào yêu cầu chức hệ thống Hình 1-5 Tổ chức hệ thống nhúng Scheduler (Bộ lập lịch) - Scheduler xem trái tim kernel Một scheduler cung cấp giải thuật cần thiết để xác định tác vụ phép thực - Các giải thuật lập lịch (schedule Algorimth) o Preemtive priority-based scheduling o Round-Robin scheduling - Các nhà sản xuất RTOS cung cấp giải thuật lập lịch trên, nhiên số trường hợp nhà phát triển hệ thống định nghĩa thêm giải thuật lập lịch 6.1 Preemtive Priority-Based scheduling Trang - Hầu hết hệ thống nhúng sử dụng giải thuật giải thuật mặc định Trong giải thuật task thực thi vị trí task có mức ưu tiên lớn task khác hệ thống Hình 1-6 Giải thuật lập lịch Preemtive Priority-Based scheduling - RTOS Kernel cung cấp 255 mức ưu tiên mức mức ưu tiên thấp nhất, 255 mức ưu tiên cao Một số kernel định nghĩa ngược lại, 255 mức ưu tiên thấp nhất, mức ưu tiên cao - Với Preemtive Priority-Based scheduling, task có mức ưu tiên khác nhau, task có mức ưu tiên cao thi hành trước Nếu task có mức ưu tiên cao task thi hành mà task trạng thái ready to run (yêu cầu thực thi) kernel lưu task hành vào TCB (task control block) chuyển sang thực task có độ ưu tiên cao - Mặc dù task tạo gán giá trị ưu tiên, xong giá trị ưu tiên thay đổi thơng qua việc sử dụng lệnh kernel hỗ trợ - Khả thay đổi mức ưu tiên task động cho phép ứng dụng hệ thống nhúng dễ dàng hiệu chỉnh kiện xảy ra, tạo hệ thống thời gian thực 6.2 Round -Robin scheduling: - Round-Robin scheduling cung cấp task khoảng thời than thực CPU - Round-Robin scheduling đáp ứng yêu cầu hệ thống thời gian thực hệ thống thời gian thực task thực nhiều mức độ ưu tiên khác nhau, thay vào preemtive priority scheduling tốt kết hợp với Round-Robin, giải thuật sử dụng khoảng thời gian thực CPU Hình 1-7 Round-Robin Preemtive priority-based scheduling Trang Task (Tác vụ): - Một phần mềm ứng dụng đơn giản thiết kế đặt thù hoạt động tuần tự, lệnh thi hành thời điểm, lệnh thực liên tiếp Mơ hình trở nên khơng thích hợp hệ thống nhúng, hệ thống nhúng thơng thường có nhiều ngõ vào nhiều ngõ ra, phần mềm ứng dụng cho hệ thống nhúng phải thiết kế để hoạt động đồng thời - Trong thiết kế đồng thời đòi hỏi nhà phát triển phải phân tích ứng dụng thành nhiều đơn vị chương trình nhỏ hoạt động liên tiếp Khi thực phân tích xong, thiết kế đồng thời cho phép hệ thống đa task vụ hoạt động dựa yêu cầu chặt chẽ thời gian cho hệ thống thời gian thực - Hầu hết kernel cung cấp task quản lý task để thích hợp cho thiết kế đồng thời - Task luồng độc lập trình thực hiện, task giành trình thực CPU Như đề cặp nhà phát triển chia ứng dụng thành nhiều task để tối ưu hóa quản lý xuất nhập trong khoảng thời gian xác định - Một task giành thời gian thực CPU theo giải thuật lập lịch kernel tạo ra, task xác định dựa thông số cấu trúc liệu riêng biệt Mỗi task tạo có tên, số hiệu (ID) mức ưu tiên khác 7.1 Các trạng thái task: - Dù task hệ thống hay task ứng dụng, thời điểm, task tồn trạng thái sau: ready, running hay block Khi hệ thống hoạt động task chuyển qua lại trạng thái - Ready state: Task sẵn sàng thực thi khơng thể task khác với mức ưu tiên cao thực thi - Block state: Task gởi yêu cầu không chấp nhận, yêu cầu thi hành phải chờ số kiện khác diễn hay bị trì hỗn khoảng thời gian - Running state: Task có mức ưu tiên cao thi hành Trang Chương GIỚI THIỆU HỆ ĐIỀU HÀNH NHÚNG hệ điều hành linux 1.1 Giới thiệu hệ điều hành Linux: Linux hệ điều hành mô Unix, Linux xây dựng dựa phần nhân (kernel) gói phần mềm mã nguồn mở Linux cơng bố quyền GPL (General Public Licence) Unix đời năm 1960, ban đầu phát triển AT&T sau đăng ký thương mại phát triển theo nhiều dòng với tên khác Năm 1990, xu hướng phát triển phần mềm mã nguồn mở xuất thúc đẩy tổ chức GNU Một số Licence mã nguồn mở xuất BSD, GPL Năm 1991, Linus Torvald viết thêm phiên nhân V0.01(kernel) đưa lên cho cộng đồng người dùng để sử dụng phát triển Năm 1996, nhân V1.0 thức cơng bố ngày quan tâm người dùng Năm 1999, phiên nhân V2.0 với nhiều đặc tính hổ trợ nhiều cho ứng dụng server Năm 2000, phiên V2.4 đời hổ trợ nhiều Linux bắt đầu bước chân vào thị trường mà chủ yếu ứng dụng mạng, ứng dụng cho thiết bị cầm tay Các phiên Linux sản phẩm đóng gói kernel gói phần mềm miễn phí khác Các phiên cơng bố licence GPL Giống Unix, Linux gồm có phần chính: Kernel, Shell cấu trúc tập file Kernel chương trình nhân, số tài liệu cịn gọi nhân hệ điều hành Linux Kernel chạy chương trình hệ thống quản lý họat động hệ thống Shell môi trường cung cấp giao diện cho người sử dụng cịn mơ tả biên dịch, Shell cầu nối giao tiếp người sử dụng nhân hệ điều hành(kernel) Shell nhận lệnh từ người dùng gởi lệnh đến nhân hệ điều hành để thực thi Hiện chủ yếu tồn shell: Bourne, Korn, C Shell Bourne phát triển phịng thí nghiệm Bell C Shell phát triển cho phiên BSD Unix Korn Shell phiên cải tiến Bourne Shell Những phiên Unix bao gồm Linux tích hợp shell Cấu trúc File hay hệ thống file (file system) quy định cách lưu trữ file đĩa File đặt thư mục Mỗi thư mục chứa File thư mực khác Một số thư mục thư mục chuẩn hệ thống sử dụng Người dùng tạo file hay thư mục riêng thay đổi file hay thư mục Trong mơi trương Linux/ Unix, người dùng cịn thay đổi quyền truy cập file hay thư mục cho phép hạn chế quyền truy cập người dùng hay nhóm người dùng Các thư mục Linux tổ hình cây, bắt đầu thư mục gốc (root), thư mục khác đuợc phân nhánh từ thư mục Kernel, Shell hệ thống File tạo nên cấu trúc hệ điều hành Với thành phần người dùng chạy chương trình, quản lý file tương tác với hệ thống 1.2 Một số phiên Linux: Redhat Fedora Core Linux có lẽ thịnh hành giới, phát hành công ty Redhat Từ năm 2003, Redhat Inc chuyển hướng kinh doanh Họ đầu tư phát triển dòng sản phẩm Redhat Interprise Linux (RHEL) với mục đích thương mại, nhắm vào cơng ty, xí nghiệp Đối với người dùng bình thường, họ mở dự án tên Fedora Redhat bỏ tiền số kỹ sư hỗ trợ cho dự án đồng thời kêu gọi chuyên viên thiết kế khắp giới qui tụ lại để phát triển Fedora Core Bản Linux Redhat cuối dừng phiên 9.0 Version Fedora Core đếm từ Có thể nghĩ đại khái FC1 tương đương Redhat 10, FC2 tương đương Redhat 11 Thực tế khác nhiều, đặc biệt từ FC2 Trang WhiteBox Linux Bản clone Redhat Enterprise Linux 3.0 Build source code RHEL nhóm kỹ sư LA, Hoa Kỳ Hiện server Nhatban.NET dùng SuSE Linux sản xuất Đức Bản Linux thịnh hành châu Âu Bắc Mỹ Năm 2003, công ty SuSE bị ông lớn Novell mua Novell dốc sức đầu tư cho SuSE để nhắm vào nhà doanh nghiệp hòng giành lại thị phần từ tay Redhat Bản SuSE 9.1 Mandrake Linux Made in France Cũng Linux thịnh hành châu Âu, Mỹ, Việt Nam Đây ưu vấn đề Việt hố Theo thơng tin ngày 22/7/2004 q trình Việt hố cho Mandrake Linux (MDK) đạt 85% Bản MDK 10.0 Turbo Linux Nổi tiếng Nhật, Trung Quốc Công ty Turbo đầu tư mạnh nhằm thống trị thị trường Linux Trung Quốc Bản Turbo 10F Debian Linuxm, ông lớn làng Linux Nhiều người có ý kiến cho rằng: “người khơng chun nên dùng Fedora Core để làm quen với kỹ thuật Linux, cịn dân chun nghiệp nên dùng Debian ổn định tuyệt vời nó” Bản nhất: 3.0R2 Vine Linux Cực kỳ ưa chuộng Nhật Được phát triển Redhat 6.2 Đặc điểm nhẹ (duy đĩa CD) hỗ trợ tiếng Nhật 100% Vine Linux tích hợp thêm số tính Debian ví dụ apt-get Bản 2.6R4 Bản 3.0 tung tháng 8/2004 Knoppix Linux sản xuất Đức Bản live Linux ưa chuộng Khởi động trực tiếp từ CD mà không cần cài đặt vào ổ cứng Phiên 3.4 Vietkey Linux sản xuất Việt Nam Hồn tồn khơng có tiếng tăm ngồi chuyện giải thi TTVN 2003 Phát triển nhóm Vietkey Redhat 7.2 Cũng nên thử cho biết sản phẩm đoạt giải TTVN vnlinuxCD Bản live CD by Larry Nguyễn Nguyên tắc vnlinuxCD giống Knoppix build Mandrake 9.2 Hỗ trợ tốt vấn đề tiếng việt Các phiên khác nhiều nhà phân phối khác Các bạn tự tìm hiểu thêm check: Slackware, Gentoo, College, Yellow Dog, SGI, Momonga 1.3 Hệ thống tập tin thư mực Linux: Trong mơi trường Windows (ví dụ 2000 hay XP), người dùng có tồn quyền tổ chức cấu trúc thư mục, số quy định truyền thống tuân theo Ví dụ tập tin hệ thống thường nằm thư mục :\Windows, chương trình thường cài đặt vào C:\Program Files, v.v Trong Linux có cấu trúc thư mục kiểu chí cịn nghiêm ngặt Hơn có tiêu chuẩn xác định cấu trúc thư mục cho hệ điều hành dòng UNIX Tiêu chuẩn gọi Filesystem Hierarchy Standart (FHS) /bin: Thư mục gồm chủ yếu chương trình, phần lớn số chúng cần cho hệ thống thời gian khởi động (hoặc chế độ người dùng bảo trì hệ thống) Ở có lưu nhiều câu lệnh thường dùng Linux /boot: Gồm tập tin cố định cần cho khởi động hệ thống, có nhân (kernel) Tập tin thư mục cần thời gian khởi động /dev: Thư mục chứa file thiết bị Trong giới Unix Linux thiết bị phần cứng xem làm file Đĩa cứng phân vùng file hda1, hda2 Đĩa mềm fd0… Các tập tin thiết bị đặt thư mục /dev /etc: Thư mục chứa file cấu hình tồn cục hệ thống Có thể có nhiều thư mục thư mục nhìn chung chúng chứa file script để khởi động hay phục vụ cho mục đích cấu hình chương trình trước khởi động Trang int counter = 0; /*Khai báo biến timer phục vụ ngắt*/ struct time_list my_timer; /*Khai báo định nghĩa hàm phục vụ ngắt*/ void timer_isr (unsigned long data) { /*In thông báo cho người dùng*/ printk (“Driver: counter++); Hello, the counter’s value is %d\n”, /*Cài đặt lại giá trị timer cho lần hoạt động tiếp theo, cài đặt chu kỳ giây*/ mod_timer (&my_timer, jiffies + HZ); } /*Thực khởi tạo timer cài đặt driver vào hệ thống, hàm init()*/ static int init my_driver_init (void) { /*Các lệnh khởi tạo khác*/ /*Khởi tạo timer hoạt động ngắt*/ /*Khởi tạo timer khai báo*/ init_timer (&my_timer); /*Cài đặt thông số cho timer*/ my_timer.expires = jiffies + HZ; //Khởi tạo trì hỗn ban đầu 1s; my_timer.data = 0; //Dữ liệu truyền cho hàm ngắt 0; my_timer.function = my_function; //Gán hàm thực thi ngắt cho timer /*Kích hoạt timer hoạt động hệ thống*/ add_timer (&my_timer); } VI Trì hỗn thời gian kernel: Trì hỗn thời gian vấn đề quan trọng lập trình driver lập trình application Trong phần trước tìm hiểu lệnh trì Trang 185 hỗn thời gian từ khoảng thời gian nhỏ tính theo nano giây đến khoảng thời gian lớn tính giây Tùy thuộc vào yêu cầu xác cao hay thấp mà áp dụng kỹ thuật trì hỗn thời gian cho phù hợp Kernel hỗ trợ kỹ thuật trì hoãn khác tùy theo yêu cầu mà áp dụng kỹ thuật phù hợp cho không ảnh hưởng đến hoạt động hệ thống Vòng lặp vơ tận: Kỹ thuật trì hỗn thời gian vịng lặp busy loop Đây cách trì hỗn thời gian cổ điển đơn giản nhất, áp dụng cho tất hệ thống Kỹ thuật trì hỗn có dạng sau: /*Khai báo thời điểm tương lai muốn thực trì hỗn*/ unsigned long timeout = jiffies + HZ/10; //Trì hỗn 10ms; /*Thực vịng lặp vơ tận while () trì hỗn thời gian*/ while (time_before(jiffies, timeout)) ; Với cách trì hỗn thời gian trên, dùng biến jiffies để so sánh với thời điểm tương lai làm điều kiện cho lệnh while () thực vịng lặp Như trì hỗn khoảng thời gian số nguyên lần tick Hơn nữa, khác với lớp user, vịng lặp kernel khơng chia tiến trình thực Vì vịng lặp vơ tận kernel chiếm hết thời gian làm việc CPU hoạt động khác không thực thi, hệ thống bị ngưng lại tạm thời Điều nguy hiểm cho ứng dụng đòi hỏi độ tin cậy cao thời gian thực Cách trì hỗn thời gian sử dụng hệ thống lớn Để giải vấn đề này, người ta dùng kỹ thuật chia tiến trình lúc thực trì hỗn sau: while (time_before(jiffies, timeout)) schedule(); //Hàm chứa thư viện Trong jiffies thõa mãn điều kiện nhỏ thời điểm đặt trước, kernel chia thời gian thực công việc khác hệ thống Cho đến vòng lặp thoát, lệnh tiếp tục thực thi Trang 186 Chúng ta áp dụng lệnh so sánh thời gian thực phần trước để thực trì hỗn thời gian với độ xác cao Trì hỗn thời gian hàm hỗ trợ sẵn: Linux kernel cung cấp cho hàm thực trì hỗn thời gian với độ xác cao, thích hợp cho khoảng thời gian nhỏ Đó hàm: void udelay(unsigned long usec); Hàm dùng để trì hỗn thời gian có độ phân giải micrô giây; void ndelay(unsigned long nsec); Hàm trì hỗn thời gian có độ phân giải nanơ giây; void mdelay(unsigned long msec); Hàm trì hỗn thời gian có độ phân giải mili giây; **Các hàm trì hỗn thời gian thích hợp cho khoảng thời gian nhỏ tick kernel Nếu lơn làm ảnh hưởng đến hoạt động hệ thống chất vịng lặp vô tận, chiếm thời gian hoạt động CPU Trì hỗn thời gian hàm schedule_timeout (): Kỹ thuật khác với hai kỹ thuật trên, dùng hàm schedule_timeout() làm cho chương trình driver dừng lại thời điểm khai báo, rơi vào trạng thái ngủ suốt thời gian trì hỗn Thời gian trì hỗn người lập trình cài đặt Để sử dụng hàm này, ta tiến hành bước sau: /*Cài đặt chương trình driver vào trạng thái ngủ*/ set_current_state (TASK_INTERRUPTIBLE); /*Cài đặt thời gian cho tín hiệu đánh thức chương trình*/ schedule_timeout (unsigned long time_interval); **Trong time_interval khoảng thời gian tính tick muốn cài đặt tín hiệu đánh thức chương trình trạng thái ngủ VII Kết luận: Trong tìm hiểu rõ cách quản lý thời gian kernel, jiffies, HZ, vai trị ý nghĩa chúng trì quản thời gian thực trì hỗn thời gian Trang 187 Chúng ta tìm hiểu hàm thao tác với thời gian thực kernel, với hàm xây dựng ứng dụng có liên quan đến thời gian thực hệ thống Có nhiều khác để thực trì hỗn kernel tương tự user Nhưng phải biết cách chọn phương pháp phù hợp để khơng làm ảnh hưởng đến hoạt động tồn hệ thống Đến bước vào thực hành, viết driver ứng dụng cho số phần cứng sau Hoàn thành giúp cho có nhìn thực tế lập trình hệ thống nhúng Trang 188 GIAO TIẾP ĐIỀU KHIỂN LED ĐƠN Bài 1: điều khiển LED đơn kit KM9260 a Kết nối phần cứng: Thực kết nối phần cứng theo sơ đồ sau board SAM9260-EK điều khiển led nối với chân PB20, PB21, PB22, PB23 b Chương trình driver: Có tên 1_1_single_led_dev.c (Mã nguồn giải thích chương trình driver chứa CD đính kèm) c Chương trình application: Có tên 1_1_single_led_app.c (Mã nguồn giải thích chương trình application chứa CD đính kèm) d Biên dịch thực thi dự án: Biên dịch driver: Trong thư mục chứa tập tin mã nguồn drive, tạo tập tin Makefile có nội dung sau: export ARCH=arm export CROSS_COMPILE=arm-none-linux-gnueabiobj-m += 1_1_single_led_dev.o all: /*Lưu ý phải đường dẫn đến cấu trúc mã nguồn kernel*/ make -C /home/arm/project/kernel/linux-2.6.30 M=$(PWD) modules clean: /*Lưu ý phải đường dẫn đến cấu trúc mã nguồn kernel*/ make -C /home/arm/project/kernel/linux-2.6.30 M=$(PWD) clean Biên dịch driver lệnh shell sau: make clean all **lúc tập tin chương trình driver tạo thành với tên 1_1_single_led_dev.ko Biên dich application: Bằng lệnh shell sau: /arm-none-linux-gnueabi-gcc 1_1_single_led_app Trang 189 1_1_single_led_app.c –o **Chương trình biên dịch có tên 1_1_single_led_app Thực thi chương trình: Chép driver application vào kit; Cài đặt driver lệnh: insmod 1_1_single_led_dev.ko Thay đổi quyền thực thi cho chương trình application lệnh: chmod 777 1_1_single_led_app Chạy chương trình quan sát kết quả: Khai báo chân PC0 ngõ ra: /1_1_single_led_app dirout 96 Using gpio pin 96 (Lúc led kết nối với PC0 tắt) Xuất liệu mức cao cho PC0: /1_1_single_led_app set 96 Using gpio pin 96 (Lúc ta thấy led nối với chân PC0 sáng lên) Xuất liệu mức thấp cho PC0: /1_1_single_led_app set 96 Using gpio pin 96 (Lúc ta thấy led nối với chân PC0 tắt xuống) Khai báo chân PA23 ngõ vào: /1_1_single_led_app dirin 55 Using gpio pin 55 **Khi công tắc nối với PA23 vị trí ON, chân PA23 nối xuống mass; Lấy liệu vào từ chân PA23 /1_1_single_led_app get 55 Using gpio pin 55 Pin 55 is LOW ** Khi công tắc nối với PA23 vị trí OFF, chân PA23 nối lên VCC; Lấy liệu vào từ chân PA23 /1_1_single_led_app get 55 Trang 190 Using gpio pin 55 Pin 55 is HIGH Bài 2: ĐIỀU KHIỂN SÁNG TẮT LED I Phác thảo dự án: Đây dự án trình lập trình điều khiển thiết bị phần cứng Người học làm quen với việc điều khiển chân gpio cho mục đích khác nhau: truy xuất liệu, cài đặt thông số chân vào vi điều khiển thông qua driver chương trình ứng dụng Để hồn thành này, người học phải có kiến thức kỹ sau: Kiến thức mối quan hệ driver application hệ thống nhúng, việc trao đổi thông tin qua lại dựa vào giao diện chuẩn; Kiến thức giao diện chuẩn ioctl giao tiếp driver (trong kernel) application (trong user); Kiến thức gpio linux kernel; Lập trình chương trình ứng dụng có sử dụng kỹ thuật hàm main có nhiều tham số giao tiếp với người dùng; Biên dịch cài đặt driver, application nạp vào hệ thống thực thi; **Tất kiến thức yêu cầu nêu trình bày kỹ phần trước Nếu cần người học quay lại tìm hiểu để bước vào nội dung hiệu a Yêu cầu dự án: Dự án có yêu cầu điều khiển thành công led đơn thông qua driver application Người dùng điều khiển led sáng tắt đọc trạng thái chân gpio theo yêu cầu nhập từ dòng lệnh shell Đầu tiên, người dùng xác định chế độ vào cho chân gpio muốn điều khiển Trang 191 Tiếp theo, chế độ ngõ vào xuất thơng tin hình hiển thị cho biết trạng thái chân gpio mức thấp hay mức cao Nếu chế độ ngõ người dùng nhập thơng tin high low để điều khiển led sáng tắt theo yêu cầu **Lưu ý, ngõ vào người dùng nên kết nối chân gpio với công tắc điều khiển ON-OFF, ngõ người dùng nên kết nối chân gpio với LED đơn theo kiểu tích cực mức cao b Phân công nhiệm vụ: Driver: có tên 1_1_single_led_dev.c Sử dụng kỹ thuật giao diện ioctl để nhận lệnh tham số từ user application thực thi điều khiển chân gpio theo yêu cầu ioctl có tham số lệnh tương ứng với khả mà driver phục vụ cho application: GPIO_DIR_IN: Cài đặt chân gpio ngõ vào; GPIO_DIR_OUT: Cài đặt chân gpio ngõ ra; GPIO_GET: Lấy liệu mức logic từ chân gpio ngõ vào trả biến user application; GPIO_SET: Xuất liệu cho chân gpio ngõ theo thông tin lấy từ biến user application tương ứng mức thấp hay mức cao; Application: có tên 1_1_single_led_app.c Sử dụng kỹ thuật lập trình hàm main có nhiều tham số lựa chọn cho người dùng khả điều khiển hình shell trình thực thi chương trình ứng dụng Theo đó, chương trình ứng dụng 1_1_single_led_app có thao tác lệnh sau: Đầu tiên người dùng nhập tên chương trình với tham số mong muốn tương ứng với lệnh muốn thực thi Nếu lệnh dirin, người dùng phải cung cấp cho driver tham số số chân gpio muốn cài đặt chế độ ngõ vào; Nếu lệnh dirout, người dùng phải cung cấp cho driver tham số số chân gpio muốn cài đặt chế độ ngõ ra; Trang 192 Nếu lệnh set, thông tin phải cung cấp chân gpio muốn xuất liệu; Nếu lệnh get, thông tin người dùng phải cung cấp số chân gpio muốn lấy liệu Sau lấy liệu, xuất hình hiển thị thông báo cho người dùng biết II Thực hiện: e Kết nối phần cứng: Thực kết nối phần cứng theo sơ đồ sau: VCC U1 PC0 VCC 19 A8 A7 A6 A5 A4 A3 A2 A1 B8 B7 B6 B5 B4 B3 B2 B1 11 12 13 14 15 16 17 18 DIR G 74HC245 R1 R1 330 D1 R1 330 D3 LED D4 LED D5 LED D6 LED D7 LED D8 LED 330 LED R1 330 R1 330 R1 330 R1 330 R1 330 R2 4k7 D2 LED R2 4k7 PA23 PB10 SW1 0 Hình 4-1- Sơ đồ kết nối LED đơn công tắc điều khiển f Chương trình driver: Có tên 1_1_single_led_dev.c (Mã nguồn giải thích chương trình driver chứa CD đính kèm) g Chương trình application: Có tên 1_1_single_led_app.c (Mã nguồn giải thích chương trình application chứa CD đính kèm) h Biên dịch thực thi dự án: Biên dịch driver: Trong thư mục chứa tập tin mã nguồn drive, tạo tập tin Makefile có nội dung sau: export ARCH=arm export CROSS_COMPILE=arm-none-linux-gnueabiobj-m += 1_1_single_led_dev.o all: Trang 193 /*Lưu ý phải đường dẫn đến cấu trúc mã nguồn kernel*/ make -C /home/arm/project/kernel/linux-2.6.30 M=$(PWD) modules clean: /*Lưu ý phải đường dẫn đến cấu trúc mã nguồn kernel*/ make -C /home/arm/project/kernel/linux-2.6.30 M=$(PWD) clean Biên dịch driver lệnh shell sau: make clean all **lúc tập tin chương trình driver tạo thành với tên 1_1_single_led_dev.ko Biên dich application: Bằng lệnh shell sau: /arm-none-linux-gnueabi-gcc 1_1_single_led_app.c 1_1_single_led_app **Chương trình biên dịch có tên 1_1_single_led_app Thực thi chương trình: Chép driver application vào kit; Cài đặt driver lệnh: insmod 1_1_single_led_dev.ko Thay đổi quyền thực thi cho chương trình application lệnh: chmod 777 1_1_single_led_app Chạy chương trình quan sát kết quả: Khai báo chân PC0 ngõ ra: /1_1_single_led_app dirout 96 Using gpio pin 96 (Lúc led kết nối với PC0 tắt) Xuất liệu mức cao cho PC0: /1_1_single_led_app set 96 Using gpio pin 96 (Lúc ta thấy led nối với chân PC0 sáng lên) Xuất liệu mức thấp cho PC0: /1_1_single_led_app set 96 Using gpio pin 96 Trang 194 –o (Lúc ta thấy led nối với chân PC0 tắt xuống) Khai báo chân PA23 ngõ vào: /1_1_single_led_app dirin 55 Using gpio pin 55 **Khi cơng tắc nối với PA23 vị trí ON, chân PA23 nối xuống mass; Lấy liệu vào từ chân PA23 /1_1_single_led_app get 55 Using gpio pin 55 Pin 55 is LOW ** Khi công tắc nối với PA23 vị trí OFF, chân PA23 nối lên VCC; Lấy liệu vào từ chân PA23 /1_1_single_led_app get 55 Using gpio pin 55 Pin 55 is HIGH **Tương tự cho chân gpio khác; Trang 195 Bài 2: ĐIỀU KHIỂN SÁNG TẮT LED I Phác thảo dự án: Dự án chủ yếu truy xuất chân gpio theo chế độ ngõ ra, điểm khác biệt so với dự án trước không điều khiển riêng lẻ bit mà công việc điều khiển driver thực Phần cho làm quen với cách điều khiển thông tin theo port bits Để việc tiếp thu đạt hiệu cao nhất, trước nghiên cứu người học phải có kiến thức kỹ sau: Kiến thức tổng quát mối quan hệ driver application hệ thống nhúng, việc trao đổi thông tin qua lại dựa vào giao diện chuẩn; Kiến thức giao diện chuẩn write giao tiếp driver (trong kernel) application (trong user); Kiến thức gpio linux kernel; Lập trình chương trình ứng dụng có sử dụng kỹ thuật hàm main có nhiều tham số giao tiếp với người dùng; Biên dịch cài đặt driver, application nạp vào hệ thống thực thi; **Tất kiến thức yêu cầu nêu chúng tơi trình bày kỹ phần trước Nếu cần người học quay lại tìm hiểu để bước vào nội dung hiệu a Yêu cầu dự án: Yêu cầu dự án điều khiển thành công port leds hoạt động chớp tắt lúc theo chù kỳ số lần nhập từ người dùng lúc gọi chương trình thực thi Khi hết nhiệm vụ chương trình chờ lần gọi thực thi Đầu tiên người dùng gọi chương trình driver, cung cấp thơng tin thời gian chu kỳ số lần nhấp nháy mong muốn; Chương trình application nhận liệu từ người dùng, tiến hành điều khiển driver tác động vào ngõ gpio làm led sáng tắt theo yều cầu; Trang 196 Lưu đồ điều khiển sau: Hình 4-2- Lưu đồ điều khiển LED sáng tắt theo số chu kỳ quy định b Phân cơng nhiệm vụ: Driver: Có tên 1_2_port_led_dev.c Driver sử dụng giao diện write() nhận liệu từ user application xuất led tương ứng với liệu nhận Dữ liệu nhận từ user application số char có bits Mỗi bit tương ứng với led cần điều khiển Nhiệm vụ driver so sánh tương ứng bit số char để định xuất mức cao hay mức thấp cho led ngoại vi Công việc driver thực sau: Yêu cầu cài đặt chân ngoại vi ngõ ra, kéo lên Công việc thực thực lệnh cài đặt driver vào hệ thống linux; Trong giao diện hàm write() (nhận liệu từ user) thực xuất mức cao mức thấp cho gpio điều khiển led Giải phóng chân gpio khai báo không cần sử dụng, công việc thực trước tháo bỏ driver khỏi hệ thống Application: Có tên 1_2_port_led_app.c Trang 197 Thực khai báo hàm main theo cấu trúc tham số để đáp ứng yêu cầu khác từ người dùng Chương trình application có hai tham số: Tham số thứ thời gian tính giây chu kỳ chớp tắt, tham số thứ hai số chu kỳ muốn chớp tắt Bên cạnh đó, phần cịn lập trình thêm số chương trình tạo hiệu ứng điều khiển led khác như: led sáng dần tắt dần (Trái qua phải, phải qua trái, ) Các chức tổng hợp chương trình application nhất, người sử dụng lựa chọn hiệu ứng thông qua tham số người dùng hàm main II Thực hiện: a Kết nối phần cứng: Các bạn thực kết nối phần cứng theo sơ đồ sau: U1 PB8 PB10 PA23 PB16 PA24 PB11 PB9 PB7 VCC 19 A8 A7 A6 A5 A4 A3 A2 A1 B8 B7 B6 B5 B4 B3 B2 B1 11 12 13 14 15 16 17 18 DIR G 74HC245 R1 R2 330 D1 D2 R8 330 D3 LED D4 LED D5 LED D6 LED D7 LED D8 LED 330 LED R3 330 R4 330 R5 330 R6 330 R7 330 LED Hình 4-3- Sơ đồ kết nối LEDs đơn **Lưu ý phải số chân quy ước b Chương trình driver: Chương trình có tên 1_2_port_led_dev.c (Mã nguồn giải thích chương trình chứa CD đính kèm) c Chương trình application: Có tên 1_2_port_led_app.c (Mã nguồn giải thích chương trình chứa CD đính kèm) d Biên dịch thực thi dự án: Biên dịch driver: Tạo tập tin Makefile thư mục với driver Có nội dung sau: export ARCH=arm export CROSS_COMPILE=arm-none-linux-gnueabiobj-m += 1_2_port_led_dev.o Trang 198 all: /*Lưu ý phải đường dẫn đến cấu trúc mã nguồn kernel*/ make -C /home/arm/project/kernel/linux-2.6.30 M=$(PWD) modules clean: /*Lưu ý phải đường dẫn đến cấu trúc mã nguồn kernel*/ make -C /home/arm/project/kernel/linux-2.6.30 M=$(PWD) clean Biên dịch application: Trỏ vào thư mục chứa tập tin chương trình, biên dịch chương trình ứng dụng với lệnh sau: arm-none-linux-gnueabi-gcc 1_2_port_led_app.c –o 1_2_port_led_app **Chương trình biên dịch thành cơng có tên là: 1_2_port_led_app Thực thi chương trình: Chép driver chương trình vào kit, thực thi kiểm tra kết quả; Cài đặt driver vào kit theo lệnh sau: insmod 1_2_port_led_dev.ko Thay đổi quyền thực thi cho chương trình ứng dụng: chmod 777 1_2_port_led_app Thực thi kiểm tra kết quả: /1_2_port_led_app 10 **Chúng ta thấy led nhấp nháy 10 lần với chu kỳ 1s Các bạn thay đổi chu kỳ số lần nhấp nháy quan sát kết Trang 199 ... is the name of the program to run; the path will be searched for this program ARG_LIST is a NULL-terminated list of character strings to be passed as the program’s argument list Returns the process... to the “ls” command */ char* arg_list[] = { “ls”, /* argv[0], the name of the program */ “-l”, “/”, NULL /* The argument list must end with a NULL */ }; /* Spawn a child process running the “ls”... Bourne phát triển phịng thí nghiệm Bell C Shell phát triển cho phiên BSD Unix Korn Shell phiên cải tiến Bourne Shell Những phiên Unix bao gồm Linux tích hợp shell Cấu trúc File hay hệ thống file (file