1. Tuyển Mod quản lý diễn đàn. Các thành viên xem chi tiết tại đây

Từ 8051 đến các hệ thống nhúng mã nguồn mở.

Chủ đề trong 'Điện - Điện tử - Viễn thông' bởi opentdoors, 21/05/2004.

  1. 0 người đang xem box này (Thành viên: 0, Khách: 0)
  1. opentdoors

    opentdoors Thành viên mới

    Tham gia ngày:
    09/01/2004
    Bài viết:
    1.205
    Đã được thích:
    0
    Từ 8051 đến các hệ thống nhúng mã nguồn mở.

    Mình xin rào trước rào sau:

    Lĩnh vực analog cũng như audio-video cũng từng là ước mơ từ lúc mình nghe nhạc, nhưng thực lòng nó quá khó, mình từ bỏ ước mơ này và ghét cay ghét đắng môn điện tử.

    Cho đến khi mình vào khoa ĐT-VT ĐHBK HN, mình tiếp xúc với ngôn ngữ lập trình C, Assembler và môn Logic, mình mới thấy hơi thích thích vi xử lý. Sau này, gặp các bạn bè cùng khoa và 1 số bạn bè là đệ tử của thầy Bình Thành, mình biết đến 8051.

    Chủ đề 8051 không mới mẻ nữa, mình muốn nói những vấn đề liên quan đến mạch nạp, cách lập trình bằng C hay asm chúng ta tạm dừng.

    Về mạch nạp các bạn tham khảo bộ easy2 của kswichit, và cũng như datasheet tại site của Atmel. Nếu vẫn chưa làm được tốt nhất chúng ta nên bỏ tiền ra mua 1 bộ, sau khi thành thạo chúng ta tạo 1 mạch nạp theo cách chúng ta hiểu, lúc đó chúng ta rao bán sản phẩm của mình cũng chưa muộn.

    Về cách lập trình, bạn nào ở HN thì đến tiệm Photo Anh Tiến gần nhà N32, chỗ ngã ba ấy, tìm cuốn "Interfacing and Programming 8051 microcontroller", đây là cuốn sách rất hay về mặt ứng dụng như điều khiển moteur, giao tiếp AD/DA, serial, Rs-485 và có cả 1 chương trình monitor. Phần lớn các vd trong sách tôi đã làm và không có 1 sai sót, đây là những chương trình mẫu mà tôi thấy dễ hiểu, có khả năng sử dụng ngay.

    Ngoài ra các cuốn khác của Mc Kenzie cũng tốt nhưng không thực tế bằng cuốn trên, sách của T.V.On là bản dịch clone của Mc Kenzie.

    Về các ứng dụng, bạn vào google đánh chữ 8052 thì sẽ có rất nhiều. Tốt nhất bạn vào các mục Application Notes của Atmel và Microchip tham khảo các ứng dụng của họ.

    Để học tập, các bạn chỉ cần sử dụng loại AT89c51/52 phổ biến. Nếu chương trình của bạn là OK trên con uC này thì có nghĩa nó OK với tất cả các uP thuộc họ c51 đến từ các hãng khác, cũng như tất cả các uP dựa trên kiến trúc Intel 8031.
  2. opentdoors

    opentdoors Thành viên mới

    Tham gia ngày:
    09/01/2004
    Bài viết:
    1.205
    Đã được thích:
    0
    PIC là 1 họ uC rấtt mạnh và HC11 cung thế. Nhưng kiến trúc của PIC khác với 8051. Mình không thành thạo về PIC nên cung không dám nói nhiều.
    Trong những bài toán điều khiển tốc độ moteur AC, người ta thường dùng PIC để tính toán các hàm PID, 8051 thường không đáp ứng được bài toán thời gian thực này. PIC có chu kỳ vòng lệnh cỡ vài trăm ns trong khi thạch anh chỉ có 4Mhz, và do dó PIC có khả năng miễn nhiễu tốt hơn. PIC có bộ nhớ data EEPROM lẫn RAM on-chip.
    Ngược lại nhân của các bộ PLC, máy nén khí, moteur DC ... các board điều khiển trong các thiết bị công nghiệp thường là 8031 của Intel hoặc của Siemens...
    Trong các tổng đài nội bộ, người ta cũng sử dụng họ 8031 ngoại trừ 1 số hãng của Nhật sử dụng uP riêng của hok ( cái này mình không biết nhiều). Ðối với các tổng đài dung lượng lớn ( loại cũ), trong các module giao tiếp thuê bao, người ta cũng sử dụng 1 em 8051 để điều khiển. Sau này người ta sử dụng 80186. Còn ngày nay, hầu hết các module trong các thiết bị viễn thông, người ta sử dụng M68K của Motorolar, mình cũng không có kinh nghiệm với họ này, ( vừa mới ra Nhật tảo mua được 1 board máy in cũ để tháo 1 em MC68000 lắp thử như cái mạch của kswichit nhưng chưa biết thế nào).
    Hình như một số hãng sx ô-tô cũng dùng họ 8031 cho bộ điều khiển. (Cái này thì vô tình search 1 mạch về xem, té ra là dùng trong ôtô, lúc đầu cứ tưởng điều khiển mạng lưới điện 3 pha). Nhung chủ yếu là PIC.
    Thực ra mình nghĩ rằng cũng không cần hiểu kỹ từng loại uP, uC nếu sử dụng ngôn ngữ C để develope. Chỉ cần chúng ta hiểu kiểu kiến trúc của chúng, sau đó sử dụng các chương trình cross có sắn free trên mạng ( chủ yếu dùng trên nền Linux) để compiler.
    HC11 mình càng không rành, ngoài vài chương trình mẫu lẫn mấy cái mạch của kswichit và 1 số site trên mạng. Ngoài Nhật tảo bán quá đắt, chắc là phải tìm trên mấy board cũ quá.
  3. opentdoors

    opentdoors Thành viên mới

    Tham gia ngày:
    09/01/2004
    Bài viết:
    1.205
    Đã được thích:
    0
    Tại sao mình đặt tên chủ đề là "Từ 8051.." chứ không phải là từ PIC hay vi điều khiển. Cái mà kiến thức 8051 đem lại cho mình là kiến trúc và cách định địa chỉ của nó, ngoài các kiến thức cần thiết khác. Khi hiểu kiến trúc 8051, mình quay lại kiến trúc của 8086 vốn rất khó hiểu ( về phần cứng).
    Tất nhiên, chúng ta nghiên cứu 80x86 không phải để viết các chương trình mới trên con uP này như là viết trên 8051mà chủ yếu phát triển các ứng dụng cụ thể trên nền các hệ điều hành đã có.
    Ứng dụng cụ thể nghĩa là 1 ứng dụng chuyên biệt dựa trên uP 80x86, với kiến trúc phần cứng tối thiểu nhất. Tuy nhiên, một ứng dụng như vậy đòi hỏi xử lý ở thời gian thực, với khả năng đáp ứng 1 cách nhanh nhất có thể của toàn bộ phần cứng và phần mềm.
    Ngày nay chúng ta nói đến 1 hệ điều hành (OS) nào đó cho PC, nghĩa là hệ OS đó có đầy đủ các yếu tố như đa nhiệm, tốc độ nhanh, và có vẻ là thời gian thực ( có vậy mới nghe nhạc, xem phim được chứ).
    Thực tế các OS đó không đáp ứng được thời gian thực, bạn thử nghe 100 bài hát, xem 100 bộ phim cùng 1 lúc xem, lúc đấy ngay cả Pentium 4 3GHz cũng đi cà nhắc.
    Cơ chế của đa nhiệm là OS lấy clock thực của phần cứng chia thành các khoảng thời gian như nhau gọi là time-slice. Cái này mình không nói nhiều được, các tài liệu tiếng Việt về OS bán ngoài hiệu sách rồi, tuy nhiên các bạn có thể đọc cuốn "Modern operation system" của Andrew Tannebaum bán tại hiệu Anh Tiến ở trên.
    Tồn tại 1 tiến trình gọi là sheduler để quyết định tiến trình nào sẽ chạy. Vấn đề là ở chỗ đó, bạn đang nghe nhạc mà khởi động một ứng dụng nào đó như Acrobat Reader, hay các phần mềm đồ hoạ thì tạm thời chờ 1 chút. Vậy nếu PC đang xử lý 1 dây chuyền công nghiệp nào đó, ví dụ đang chuẩn bị đóng nắp chai mà Acrobat hay AutoCad lại khởi động thì sẽ có 1 số cụ đi tàu bay.
    Vậy các OS đó không đáp ứng được thời gian thực.
  4. opentdoors

    opentdoors Thành viên mới

    Tham gia ngày:
    09/01/2004
    Bài viết:
    1.205
    Đã được thích:
    0
    Sự xuất hiện của Linux, cùng với ngôn ngữ lập trình Java mang lại khả năng phát triển các hệ thống nhúng-thời gian thực rộng rãi hơn.
    Trước Linux đã có những hệ OS thời gian thực như vxwork, qnx... và ngôn ngữ lập trình sử dụng chủ yếu trong các hệ thống này Ada, ngoài ra còn ngôn ngữ C/C++, Modular-1, Occam-2. Cái này mình biết dựa trên 1 số tài liệu hướng dẫn lập trình thời gian thực.
    Java hiện nay được sử dụng rộng rãi do cơ chế lập trình đa nhiệm của nó đơn giản hơn các ngôn ngữ khác, mặt khác mã sinh ra của Java là mã hexa, nghĩa là không phụ thuộc vào kiến trúc của vi xử lý, loại vi xử lý, cũng như không phụ thuộc vào OS nào.
    Việc xử lý mã hexa này thành mã nhị phân để chạy trên 1 platform cụ thể sẽ do máy ảo JVM thực hiện, mỗi một kiến trúc platform khác nhau sẽ có máy JVM khác nhau.
    Linux là OS mã nguồn mở nên người sử dụng (các chuyên gia và hacker )có khả năng tiếp cận với mã nguồn và xây dựng các hệ thống ứng dụng khác nhau trong dải rộng từ ứng dụng máy chủ, tính toán xử lý song song ( cái này là cơ sở để xây dựng các siêu máy tính), cho đến máy PC, thiết bị hand-held...
    Các bạn có thể tham khảo tại site:
    linuxdevices và FSMLab để tham khảo về các thiết bị nhúng, và thời gian thực.
    moxa tham khảo các thiết bị công nghiệp.
  5. opentdoors

    opentdoors Thành viên mới

    Tham gia ngày:
    09/01/2004
    Bài viết:
    1.205
    Đã được thích:
    0
    Mình nói qua về 1 hệ OS đa nhiệm.
    Đối với 8051 và PIC, hiện nay có phần mềm Salvo OS, cung cấp các hàm hệ thống cũng như các hàm xử lý tiến trình, bạn tham khảo tại App notes của Microchip. Ngoài ra nếu lập trình với Keil C, thì bản thân Keil C cũng hỗ trợ việc lập trình đa nhiệm.
    Tuy nhiên, các OS đa nhiệm không giống như trên PC. Mà tất cả các hàm hệ thống cùng với các task được định nghĩa vào lúc viết chương trình.
    Bạn tìm cuốn "Real-time systems design and analysis" của Philip A.Laplante để đọc hiểu sâu hơn.
    Mình mô tả 1 hệ OS đa nhiệm cho 8051:
    - Để phân chia đồng hồ thành các khoảng thời gian gọi là run-time cho mỗi task, mình sử dụng timer0, do T1 sử dụng cho serial. Cứ mỗi lần ngắt T0 xảy ra hàm xử lý ngắt sẽ thực hiện việc switching từ task này sang task tiếp theo.
    -Tồn tai các hàm chuyển đổi ngữ cảnh (context), khi 1 task tiếp theo được chạy thì tất cả các bộ nhớ sử dụng chung như các thanh ghi, ram trong... của task trước đó cần phải save lại. Và khi task tiếp theo chuẩn bị chạy thì các giá trị được save trước đó phải phải được restore lại như tại thời điểm nó đang chạy trước đó.
    -Mỗi task sẽ có 1 stack riêng, tuỳ theo số lượng byte, giá trị của các thanh ghi... mình tính ra dung lượng của từng stack.
    -Tạo 1 mảng sp_init [ ] mà các phần tử là các giá trị khởi tạo stack cho mỗi task. sp_init [ i ]=giá trị khởi tạo sp của task i
    -Tồn tại 1 mảng sp_table [ ] để lưu giá trị thanh ghi sp vào lúc ngắt 0 xảy ra trên task i.
    - Để đơn giản mình sử dụng thuật toán chuỗi semaphore nhị phân để chia sẻ tài nguyên giữa các task.
    - Tồn tại 1 task gọi là sheduler được gọi khi ngắt T0 xảy ra để switch từ task này sang task khác.
    Vậy mình sẽ tạo các hàm hệ thống :
    +CreateTask: khởi tạo stack cho task.
    +Sheduler: điều khiển thanh ghi PC cho các task và chuyển đổi ngữ cảnh giữa các task.
    +Tạo 2 bảng n-way cho các hàm save và restore context từng task.
  6. tvietp

    tvietp Thành viên quen thuộc

    Tham gia ngày:
    19/11/2003
    Bài viết:
    681
    Đã được thích:
    0
    Anh có thể chỉ kĩ hơn không em cũng ở BK nhưng chưa biết nhà N32 nó ở đâu. ngã ba có phải là ngã ba để rẽ vào trường bằng cổng C14 không
  7. opentdoors

    opentdoors Thành viên mới

    Tham gia ngày:
    09/01/2004
    Bài viết:
    1.205
    Đã được thích:
    0
    Có 2 ngã 3, 1 thì dọc theo sông thì không phải, 1 thì đi vào khu giảng đường nhà cấp 4. Cái ngã 3 mà có nhà nấu bia BK, bên cạnh có 1 hiệu sách, bên cạnh hiệu sách là hiệu Anh Tiến. Tiệm này rất quen thuộc với sv khoa CNTT và ĐTVT.
    Khi mình học thì khu giảng đường trên gọi là nhà N32,33,34. Còn bây giờ không biết gọi là gì.
  8. opentdoors

    opentdoors Thành viên mới

    Tham gia ngày:
    09/01/2004
    Bài viết:
    1.205
    Đã được thích:
    0
    Có nhiều con đường dẫn đến Linux, đối với mình ban đầu là tìm hiểu hệ thống clustering đang phát triển với Linux. Mô hình tính toán clustering (tính toán song song được nghiên cứu tại khoa CNTT do thầy Nguyễn Thanh Thuỷ chủ trì). Nhưng đây là 1 vấn đề quá lớn đối với phạm vi 1 đề tài khoa học cấp khoa hay đồ án tốt nghiệp ĐH.
    Sau này, mình thử tạo 1 cơ chế đa nhiệm cho 8051, do không có kiến thức đầy đủ về hệ điều hành nên chỉ là lần mò không thành công. Mình bắt đầu lại với kiến thức về Linux kernel để tìm hiểu kiến trúc của 1 hệ thống đa nhiệm. Tất nhiên đây chỉ là nghiên cứu, 8051 là nơi để thực hành.
    Trở lại với vấn đề đa nhiệm với 8051, nguyên lý mình áp dụng là dựa trên cách xử lý thanh ghi đếm chương trình PC. Khi 1 ngắt hay 1 lời gọi chương trình con xảy ra thì PC được push vào stack, tại 1 lúc nào đó khi hàm ret hay reti được gọi thì 2 byte trong stack đang được sp trỏ đến được pop vào PC và 8051 thi hành các lệnh bắt đầu từ địa chỉ trong PC.
    Vậy nếu ngắt xảy ra khi 1 task đang chạy thì tại địa chỉ của task bị ngắt các giá trị của PC, biến được hàm thi hành ngắt ( hàm sheduler )lưu vào stack của task, và thanh ghi sp được lưu lại ở đâu đó. Sau đó hàm sheduler sẽ lấy giá trị đỉnh stack của task kế tiếp lưu vào thanh ghi sp, sau khi gặp lệnh reti thì task kế tiếp sẽ thực hiện.
    Được opentdoors sửa chữa / chuyển vào 11:27 ngày 22/05/2004
  9. kinhbac

    kinhbac Thành viên mới

    Tham gia ngày:
    10/12/2003
    Bài viết:
    49
    Đã được thích:
    0
    Vấn đề Opentdoor đưa ra rất hay, tuy nhiên minh băn khoăn một chỗ: khi chạy đa nhiêm trên cấu trúc 8051 đòi hỏi rất nhiều không gian nhớ cho những việc chuyển đổi ngữ cảnh, ... mà không gian nhớ của 8051 lại rất chật hẹp.
    Vấn đề nữa là clock của 8051 cũng khá thấp so với PC, khi đa nhiệm ta cũng vẫn phải phân chia thời gian, vậy sẽ delay nhiều đến mức không thể gọi là realtime chưa ?
  10. Quen_mang_kinh

    Quen_mang_kinh Thành viên quen thuộc

    Tham gia ngày:
    23/05/2002
    Bài viết:
    542
    Đã được thích:
    1
    Bác làm đa nhiệm cho 8051 (không hiều ý thế nào) chứ giống như tìm cách cho cái xe đạp vốn đèo được 2 người tối đa đèo 4 người [​IMG].
    Em nghĩ nên nghiên cứu sử dụng nhiều vi xử lý để giải quyết một bài toán thì hơn.
    Thực ra vi xử lý bon mình vẫn hay làm cho đa nhiệm đó chính là kiến trúc chương trình kiều PLC. Bác thử tìm hiểu.

Chia sẻ trang này