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. trungk43

    trungk43 Thành viên mới

    Tham gia ngày:
    03/07/2001
    Bài viết:
    59
    Đã được thích:
    0
    Chào các anh, nhân nói về RTOS cho 8051,
    em xin giới thiệu một quyển sách mà em cho là rất hay:
    uC/OS-II, The Real-Time Kernel
    Các anh co thể down code ở http://www.ucos-ii.com/
    http://www.ucos-ii.com/contents/products/ucos-ii/ports.html
    Nếu anh nào cần thì em sẽ up lên.
    Được trungk43 sửa chữa / chuyển vào 19:18 ngày 26/05/2004
  2. TuLa

    TuLa Thành viên quen thuộc

    Tham gia ngày:
    24/10/2002
    Bài viết:
    413
    Đã được thích:
    0
    Yêu cầu money thi mới download đc ! Làm thế nào để down một cách free ?
    Ahhh, tiện đây hỏi luôn bác nào biết cách chôm các book ở Amazon mà kô phải pay money ko nhỉ, mình nghe nói có cách truy cập qua FTP của thằng khác... nhưng chưa biết thực hư thế nào ?
    (sorry đã chèn ý kô chuẩn tắc này vào chủ đề của bác Open, nếu bác nvl thấy có vấn đề thì erase hộ vậy)
  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
    Trang này có thể rất cần thiế cho mình, mình cũng chưa xem kỹ nữa.
    Nếu bạn đã hiểu mã mà bạn đã load xuống thì bạn thêm vào đây nhé.
    Mình post tiếp 1 số mã, đây chỉ là skeleton, không thể ( cá nhân mình) đưa ra 1 HĐH chuẩn được.
    Một task định nghĩa như 1 vòng lặp vô tận, vd:
    org xxxxH
    ...
    task_i:
    ;đoạn chương trình của task i
    ...
    ljmp task_i
    ...
    Để đơn giản mình sử dụng cấu trúc round-robin của HĐH, nghĩa sau 1 khoảng thời gian task kế tiếp được chạy và cứ lần lượt như vậy. Không có task nào được ưu tiên, và không sử dụng ngắt ngoài ( cái này có thêm thì cũng không khó lắm).
    Đầu tiên là hàm createTask, hàm này sử dụng như sau:
    ......
    mov dptr,#task_i
    mov a,id; hoặc mov a,#id_i
    lcall createTask
    .......
    trong đó id là 1 biến khai báo trong RAM nội, vd: id equ 08H chẳng hạn. Hoặc id có thể gán trực tiếp bằng 1 hằng số.
    createTask (char task_i, int id)
    {
    sp=sp_init[id];
    push task_i ;
    sp_tab[ id]= sp;
    }
    Viết bằng asm:
    sp_tab equ 18H
    sp_init: db 20H,2AH...
    createTask:
    mov b,a
    mov sdph,dph
    mov sdpl,dpl
    mov dptr,#sp_init
    movc a,@a+dptr
    mov sp,a
    push sdph
    push sdpl
    mov a,b
    mov R0,#sp_tab
    add R0,a
    mov @R0,sp
    ret
    sp_init là mảng các hằng số định nghĩa đáy của stack của 1 task, còn sp_tab là 1 mảng lưu giá trị của sp sau khi task chạy hết thời gian giành và bị ngắt. sdph, sdpl là 2 biến tạm thời cho dptr.
  4. 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
    Hiểu ý của bác rồi đợi bác post thêm một chút nữa (với lại đang bận) rồi bàn thêm một thể.
    Ban gi co quyen sach hay hay share di.
  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
    Quyển sách về 8051 mà mình thích nhất là cuốn " Interfacing...." mình nói rồi đấy, không biết Phòng Photo khoa CNTT ĐHBK TP có không, mình cũng hay vào đấy hình như không có, mình có 2 bản photo, bạn thích thì đưa đia địa chỉ mình gởi cho. Cuốn này cũng cơ bản thôi.
    Tài liệu:
    -Using Pic MicroMCU to connect Internet via PPP tại site Application Notes của Microchip. Mã viết bằng C nên rất dễ hiểu, thảm khảo thêm RFC1548.
    - TinyBios: site www.pcengines.com : tài liệu và mã nguồn về lập trình PC Bios.
    - ELKS : mã viết bằng C tại site elks.sf.net, 1 HĐH nhỏ cho ai quan tâm đến vi xử lý 8086.
    -BlueCat 5.0 tại www.lynuxwork.com.
  6. 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 liệu trên mạng thì rất nhiều, mình search là chủ yếu. Chủ yếu mình giới thiệu, các bạn tham khảo, có ý gì hay thì trao đổi.
    Còn sách thì cũng nhiều, mình chỉ biết tên và có bản photo từ lúc còn sv.
  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
    http://www.ucos-ii.com/contents/support/appl_notes.html
    http://www.ucos-ii.com/contents/products/ucos-ii/ports-intel.html
    http://www.ucos-ii.com/contents/products/ucos-ii/downloads/
    Được opentdoors sửa chữa / chuyển vào 16:27 ngày 28/05/2004
  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
    post tiếp:
    Đây là hàm sheduler, bản thân nó cũng là 1 task, nhưng có quyền cao nhất:
    sheduler:
    push acc
    push 0
    mov a,exec_id; lấy id của task đang chạy vừa bị nhắt
    ; inc a ; lấy id của task kế tiếp hoặc task có độ ưu tiên cao hơn
    ; cjne a,#numOftasks,_continue
    clr a
    _continue:
    mov rdy_id,a; chỉ định task chuẩn bị chạy
    mov sdph,dph
    mov sdpl, dpl
    mov dptr,#SaveContextTable ;trỏ các hàm save context
    branching: mov a,exec_id
    rl a; a*=2
    inc a
    movc a,@a+dptr
    push acc
    mov a,exec_id
    rl a
    movc a,@a+adptr
    push acc
    ret
    switching: mov R0,#sp_tab
    add R0,exec_id
    mov @R0,sp
    ; chỉ định stack của task kế tiếp
    mov R0,#sp_tab
    add R0,rdy_id
    mov sp,@R0
    mov exec_id,rdy_id
    mov dptr,#RestoreContextTable
    ajmp branching
    running: pop 0
    pop acc
    reti
    ; Các hàm save context và restore context được khai báo như sau:
    org yyyyH
    SaveContextTable:
    dw <hàm save của task đầu tiên>
    ..
    dw <hàm save của task i>
    dw <hàm save của task i+1>
    RestoreContextTable:
    dw <hàm restore của task đầu tiên>
    ..
    dw <hàm restore của task i>
    dw <hàm restore của task i+1>
    Hàm save context của task i được định nghĩa như sau:
    push sdph
    push sdpl
    push....
    ...
    ajmp switching
    Và hàm restore context của task i được định nghĩa như sau:
    pop....
    ...
    pop dph
    pop dpl
    ajmp running
    Ở đây exec_id và rdy_id là các byte trong RAM nội được khai báo như biến toàn cục.
    exec_id equ ...
    rdy_id equ ...
    Được opentdoors sửa chữa / chuyển vào 01:11 ngày 30/05/2004
  9. 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
    Thông thường 1 chương trình cho 8051 như sau:
    org 0
    ljmp main
    .......
    org zzzzH
    main:
    ; thiết lập các chế độ của 8051
    ; thiết lâp các thông số cho timer0 hoạt động ở mode 2
    ; createTask
    Ở đây các task được định nghĩa lúc viết chương trình. Trong các hệ điều hành PC, có 1 task hoạt động ở chế độ user mà được gọi là shell, do đó người dùng có thể chạy 1 chương trình nào đó như 1task, khi đó shell chuyển cho kernel để cung cấp stack và các hàm switch context để chương trình đó chạy như 1 tiến trình trong hệ thống.
    Với 8051 hoàn toàn có thể tạo ra 1 chương trình kiểu như shell với phần hiển thị người dùng ở màn hình Hyper Terminal, nhưng khi đó sẽ phức tạp hơn. Khi đó ít khi dùng 8051 mà người ta sử dụng các uP có cấu trúc phù hợp hơn, vd như uP của Motorola chẳng hạn. Khi các ứng dụng cần đến mức như vậy, mình sẽ sử dụng PC, phần hiển thị có thể hiển thị ở 1 LCD hay thông qua cổng console.
  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
    Tôi nghĩ thêm shell vào là cả một vấn đề đấy... Nếu chỉ display thôi thì không nói nhưng nếu có các phím để người dùng cản thiệp nữa. Can thiệp của người sử dụng có thể làm mất tính cấu trúc của chương trình.
    Tôi nghĩ vấn đề để một hệ này được đánh giá hơn một hệ khác là xử lý ngoại lệ. Làm gì khi có một ngoại lệ sinh ra ???
    Vài hôm nữa sẽ bàn luận với bác. Tôi vẫn theo dõi.

Chia sẻ trang này