Thông báo

Collapse
No announcement yet.

hOS - Preemptive Multitasking RTOS by Bui Viet Hoang

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • hOS - Preemptive Multitasking RTOS by Bui Viet Hoang

    Xin chào các tín đồ của RTOS!

    Có lẽ sẽ hơi thừa nếu chúng ta lại mở thêm một luồng để tản mạn về RTOS. Nhưng các bạn đã bao giờ nghĩ đến một hệ điều hành thời gian thực nho nhỏ Made In Vietnam chưa?

    Xin giới thiệu với các bạn một RTOS có tên gọi là hOS với những đặc điểm như sau:
    - Preemptive Multitasking
    - Hỗ trợ lập lịch CPU theo chiến lược WRR (Weighed Round Robin)
    - Tương thích dễ dàng với nhiều loại vi xử lý và trình biên dịch
    - Nhỏ gọn và dễ sử dụng
    - Cho phép người dùng tự chọn Timer và chu kì chuyển tác vụ
    - Hỗ trợ cap phát bộ nhớ cho ngăn xếp theo cả động (malloc) và tĩnh (mảng)
    - Hỗ trợ các dịch vụ cơ bản như semaphore, queue, timer,...

    Ngày xưa khi còn là sinh viên năm thứ 3 đại học, mình có viết một cơ chế đa nhiệm cho dòng vi xử lý 8051, nhưng thật tiếc là nó đã không được phát triển và ứng dụng rộng rãi vì lí do tương thích. Sau này mình mới biết là từ những năm 70 người Mỹ đã làm ra được những hệ thống hoàn thiện hơn thế nhiều và một số trong đó được gọi là RTOS.

    Tại sao đến ngày nay người ta vẫn phát triển RTOS trong khi đã có rất nhiều loại trên thị trường? Câu hỏi này cũng giống như câu hỏi tại sao các hãng vẫn rất khoái sản xuất vi xử lý 8 bít trong khi ARM có sức mạnh vượt trội.

    Lý do mình viết hOS một phần là vì đam mê, nhưng phần nhiều là để mọi người có thêm một lựa chọn dùng RTOS.

    Ngoài những đặc tính về mức độ hiệu quả, một đặc tính khác của RTOS mà người dùng quan tâm là nó có dễ sử dụng và có tương thích với nhiều họ vi xử lý hay không.

    Vấn đề dễ sử dụng được tác giả của hOS nghiên cứu kĩ lưỡng trước khi triển khai. Bạn sẽ thấy công việc cấu hình để hOS chạy trên MCU của bạn rất đơn giản và cũng rất linh hoạt. Vấn đề tương thích với nhiều họ vi xử lý cũng được khá nhiều nhà phát triển chuyên nghiệp quan tâm, vì hâu như họ không muốn phụ thuộc vào 1 dòng MCU, trong khi họ cũng không muốn cấu trúc chương trình của mình phải thay đổi mỗi khi nâng cấp sản phẩm.

    Điểm khác biệt của hOS so với khá nhiều RTOS khác đó là toàn bộ việc lưu trữ và phục hồi ngữ cảnh của các tiến trình đều được đẩy cho CPU hoặc trình biên dịch tự làm. Việc này sẽ hiệu quả và chính xác hơn vì chỉ có CPU hoặc trình biên dịch mới biết những thanh ghi nào của CPU được sử dụng trong hàm chuyển ngữ cảnh. Việc này cũng cách ly ứng dụng của các bạn khỏi những lệnh mã máy khó hiểu.

    Ban đầu, hOS được mình phát triển cho dòng STM8 của STmicroelectronics. Sau đó hOS được port thành công cho dòng ATMEGA của ATMEL. Việc port sang các dòng khác, kể cả ARM cũng sẽ rất đơn giản.

    Hiệu quả của hOS còn cần phải kiểm chứng, và bản thân hOS cũng mới đi đến giai đoạn gần hoàn thiện phiên bản thứ nhất.

    Các bạn tải về tệp gửi kèm. Trong đó là thư viện nanokernel của hOS và một ứng dụng demo gồm có 4 tiến trình chạy song song. Ứng dụng được viết trên AVRGCC. Các bạn có thể dùng AVRStudio để chạy, biên dịch và sửa đổi để test thử. Có gì thắc mắc các bạn cứ post lên nhé.

    Mình sẽ tiếp tục cập nhật và mong hồi âm của các bạn.
    Attached Files
    Last edited by bvhoang; 28-04-2011, 09:23.

  • #2
    Hướng dẫn lập trình với hOS

    Hi All,

    Hôm nay mình sẽ giới thiệu cách lập trình đa nhiệm cho một dòng vi điều khiển cụ thể - ATMEGA8, sử dụng hOS và trình biên dịch AVRGCC.

    Trước hết, để theo dõi và làm theo những hướng dẫn của mình, các bạn hãy đảm bảo rằng bạn đã cài ứng dụng AVRStudio và trình dịch AVRGCC vào máy.
    Sau đó các bạn tải lại file hOS_ATMEGA_AVRGCC (LIB).zip mình mới update, rồi giải nén ra một thư mục nào đó. Các bạn mở file project này (HOSDEMO.aps) bằng AVRStudio.

    Đến đây bạn thấy rằng cấu trúc của một project dùng hOS là rất đơn giản:

    Các file mã nguồn gồm:
    - hosDemo.c chứa các khai báo, định nghĩa chương trình chính và các task.
    - uart.c là một module mình thêm vào để giao tiếp RS232, cái này không liên quan đến hOS.

    Các file dẫn hướng gồm có:
    - hosCore.h chứa các khai báo hàm trong thư viện hosCore.o
    - hosPort.h là file dùng để khai báo các kiểu dữ liệu sử dụng trong một trình biên dịch cụ thể, ở đây là AVRGCC.
    (Với các project khác, bạn có thể sử dụng lại file này mà không cần sử đổi)
    - uart.h chứa các khai báo hàm các hàm trong uart.c

    File thư viện đóng gói gồm hosCore.o.
    NHỮNG HÀM TRONG HOSCORE.O CHÍNH LÀ LÕI NANOKERNEL CỦA HOS. NHỮNG HÀM NÀY ĐÃ ĐƯỢC ĐÓNG GÓI SẴN VÀ DÙNG CHUNG CHO CÁC PROJECT KHÁC VỚI DÒNG ATMEGA. ĐỂ SỬ DỤNG HOS, TA PHẢI CẦN ĐẾN FILE HOSCORE.H ĐỂ KHAI BÁO RẰNG CÁC HÀM NÀY ĐÃ CÓ MẶT TRONG PROJECT.
    Trong phần Project/ Configuration Options bạn sẽ thấy file thư viện HOSCORE.O đã được thêm vào project qua chức năng Add Object... Khi dịch, trình biên dịch sẽ liên kết các hàm đã khai báo trong file hosCore.h từ file HOSCORE.O này, để tạo ra file mã máy (HEX).

    Đến đây bạn cũng có thể suy luận rằng các file hosDemo.c, uart.c (kèm theo uart.h) chính là ứng dụng của bạn, còn các file hệ thống mà sau này các bạn có thể dùng lại với các project khác mà không cần sửa đổi là: hosCore.o (kèm theo hosCore.h) và hosPort.h

    Như vậy ta đã tìm hiểu xong về cấu trúc một project dùng RTOS hOS. Nó khá đơn giản và dễ hiểu. Bây giờ chúng ta sẽ chuyển sang vấn đề chính là cách viết ứng dụng cụ thể trong chương trình để có thể chạy đa nhiệm được các task.

    Vì các file uart.c và uart.h chỉ là các file module viết kèm theo và tách biệt với hosDemo.c cho đỡ rườm ra, nên các bạn có thể không cần quan tâm tới nội dung của file này. Chúng ta sẽ xem xét nội dung của file hosDemo.c xem trong đó có những gì.

    Code:
    // hOS demonstration with 4 Normal tasks and an Idle task
    // hOS is a Preemptive Multitasking RTOS by Bui Viet Hoang
    
    
    #include <avr/io.h>
    #include <avr/pgmspace.h>
    #include <avr/eeprom.h>
    #include <avr/interrupt.h>
    #include <stdio.h>
    
    #include "uart.h"
    
    
    #include "hosCore.h" // hOS Nano-kernel
    
    
    
    // Definitions for Port I/O Access
    #define setpin(__PORT, __pin)  __PORT|= (1<< __pin)
    #define clrpin(__PORT, __pin)  __PORT&= ~(1<< __pin)
    #define pintest(__PORT, __pin)  (__PORT&(1<< __pin))
    
    
    
    
    
    // Task Control Blocks
    hosTask TA, TB, TC, TD, TI;
    
    // Stack Arrays used for Tasks
    UINT8 StackA[32], StackB[32], StackC[32], StackD[32], StackI[32];
    
    
    // Tasks and Functions Prototypes
    void TaskA(void);
    void TaskB(void);
    void TaskC(void);
    void TaskD(void);
    void TaskI(void);
    
    
    // User must define a function that configures the system tick
    // Because the scheduler will call it to implement its algorithm
    // There are 3 things you have to do:
    // 1. Setup Task Switch Period according to its parameter
    // 2. Enable Timer Overflow Interrupt
    // 3. Enable All Interrupts
    // In main, use hosWrapperConfigTick() to register it to the scheduler
    void SystemTickConfig(BOOL);
    
    // User function to configure Board and IO ports
    void MyBoardConfig(void);
    
    
    
    
    
    
    
    // Main Program only starts Tasks and then does nothing
    int main(void)
    {
    	// User board configuration
    	MyBoardConfig();
    
    	// Register the SystemTick configuration function
    	hosWrapperConfigTick(SystemTickConfig);
    
    	// Initiate HOS environment
    	hosSchedulerInit();
    
    	// Create Tasks
    
    	hosTaskCreate(
    		&TA, // Address of Task Control Block
    		2, // Task Preemptive Priority (0-255)
    		10, // Task Weight in Round-Robin mode (0-10)
    		TaskA, // Task Function
    		StackA, // Array of Bytes for stack
    		32); // Stack Size in Bytes
    
    	hosTaskCreate(&TB, 1, 5, TaskB, StackB, 32);
    	hosTaskCreate(&TC, 1, 5, TaskC, StackC, 32);
    	hosTaskCreate(&TD, 1, 5, TaskD, StackD, 32);
    	hosTaskCreate(&TI, 0, 5, TaskI, StackI, 32); // Idle task has a priority of 0
    
    	// Enable tasks to run
    	hosSchedulerRun();
    
    
    
    	// Unreachable Code
    	while(1);
    	return 0;
    }
    
    
    
    
    
    
    
    
    // Interrupt Service Routine that periodically calls the Task Switcher
    ISR(TIMER0_OVF_vect)
    {
    	hosSchedulerISR();
    }
    
    
    
    
    
    
    void MyBoardConfig()
    {
    	// Optional, Make sure ISR vector table are in the program section
    	#ifdef _AVR_IOM8_H_
    	GICR= (1<< IVCE);
    	GICR= (0<< IVSEL)|(0<< IVCE);
    	#endif
    
    
    	// IO Config
    	PORTD= 0b11111100;
    	DDRD = 0b11111111;
    	PORTB= 0b11111111;
    	DDRB = 0b11111111;
    	PORTC= 0b01111111;
    	DDRC = 0b01010011;
    }
    
    
    // SystemTick Configuration
    // If Trap is TRUE, set the minimum waiting time for interrupt to occur
    // Else set the interrupt period to be between 0.2 and 2ms
    void SystemTickConfig(BOOL Trap)
    {
    	if(Trap)
    	{
    		// Prescaler Settings
    		TCCR0= 0x02;
    		// Set Time Slice to minimum
    		TCNT0= 0xFF-1; // Initial value
    	}
    	else
    	{
    		// Prescaler Settings
    		TCCR0= 0x03;
    		// Set Time Slice proportional to parameter Ticks
    		TCNT0= 0xFF-125; // Initial value
    	}
    
    	// Enable Overflow Interrupt
    	TIMSK= 0x01;
    
    	// Enable All Interrupts
    	sei();
    }
    
    
    
    // TaskA generates pulses at a frequency of 100 system ticks
    void TaskA()
    {
    	while(1)
    	{
    		hosTaskSleep(50);
    		setpin(PORTB, 1);
    		hosTaskSleep(50);
    		clrpin(PORTB, 1);
    	}
    }
    
    
    
    void TaskB()
    {
    	// Task B was created with the highest priority so it runs first
    	uart_init();
    	uart_puts("hOS Demonstration by Bui Viet Hoang\r\n");
    
    	// Task B is set to the same priority as other tasks
    	hosTaskSetPriority(&TB, 1);
    
    	// From this point, All tasks run in Round-Robin mode
    	while(1)
    	{
    		hosTaskSleep(100);
    		setpin(PORTB, 2);
    		hosTaskSleep(100);
    		clrpin(PORTB, 2);
    	}
    }
    
    
    
    // TaskC generates 10 pulses at a frequency of 500 system ticks
    // And then ternminates
    void TaskC()
    {
    	UINT8 i;
    
    	for(i= 0; i< 10; i++)
    	{
    		hosTaskSleep(250);
    		setpin(PORTB, 3);
    		hosTaskSleep(250);
    		clrpin(PORTB, 3);
    	}
    
    	hosTaskExit();
    }
    
    
    // TaskD generates pulses at a frequency of 1000 system ticks
    void TaskD()
    {
    	while(1)
    	{
    		hosTaskSleep(900);
    		setpin(PORTB, 4);
    		hosTaskSleep(100);
    		clrpin(PORTB, 4);
    	}
    }
    
    // Idle Task takes control over CPU only when no task is active
    // In this application, Idle task simply does nothing
    void TaskI()
    {
    	while(1)
    	{
    		// Do Nothing
    	}
    }

    Nội dung của project này là tạo ra 4 task chạy song song: TaskA, TaskB, TaskC và TaskD. TaskB có ưu tiên cao nhất sẽ chạy trước tất cả để in một dòng thông điệp qua cổng UART, sau khi TaskB tự đặt ưu tiên (hosTaskSetPriority())của nó xuống bằng các task khác thì 4 task sẽ chạy song song với nhau. Sau khoảng vài giây thì TaskC sẽ tự động kết thúc bằng lệnh hosTaskExit(), chỉ còn TaskA, TaskB, và TaskD chạy. Việc các Task chạy được thể hiện qua trạng thái logic của các chân ra tương ứng:
    TaskA: PORTB1 tạo xung chu kì 100 nhịp hệ thống (~100ms)
    TaskB: PORTB2 tạo xung chu kì 200 nhịp hệ thống (~200ms)
    TaskC: PORTB3 tạo xung chu kì 500 nhịp hệ thống (~500ms)
    TaskD: PORTB4 tạo xung chu kì 1000 nhịp hệ thống (~1000ms)

    File này có thể hơi dài vì nó có một số đoạn comment mình viết, nhưng tính ra thì file khá ngắn và bố cục khá gọn. Phần trên là khai báo include (các bạn để ý có include "hoscore.h"), phần dưới là khái báo các task TaskA, TaskB, TaskC, TaskD và hàm main(), hàm tạo nhịp hệ thống (SystemTick), và hàm ngắt chuyển đổi giữa các task (Scheduler)

    Thứ tự khởi tạo hOS và cho các task chạy rất đơn giản.

    Ở trong hàm ngắt của Timer nào đó, bạn gọi hàm hosSchedulerISR() để thực hiện việc chuyển task.
    Ở đâu đó bạn khái báo một hàm tạo nhịp hệ thống bằng cách cấu hình cho Timer này và cho phép ngắt Timer, ngắt hệ thống hoạt động.

    Trong hàm main các bạn thực hiện các bước sau:

    1. Đăng kí hàm tạo nhịp hệ thống bằng hàm hosWrapperConfigTick()
    2. Gọi hàm hosSchedulerInit()
    3. Tạo các task bằng hàm hosTaskCreate()
    4. Bắt đầu chạy các task bằng hàm hosSchedulerRun()

    Các bạn có thể xem file mô phỏng Proteus mình gửi kèm để thấy các task chạy song song như thế nào. Các bạn cũng có thể nạp vào mạch nào đó mà các bạn có sẵn để xem các chân B1, B2, B3, B4 và cổng truyền thông uart hoạt động thật.

    Như vậy là bây giờ các bạn đã có thể viết các ứng dụng chạy đồng thời nhiều chương trình song song. Các bạn có thể dựa vào project này để tạo một ứng dụng khác, chẳng hạn như hiển thị LCD, nháy LED, đo ADC, kêu loa, và quét bàn phím sử dụng 5 task khác nhau..

    Luồng này có vẻ có nhiều người hứng thú nhưng chưa có ý kiến. Mong rằng sau ví dụ cụ thể này, các bạn đã gần gũi hơn với hOS. Các bạn có thể đặt vấn đề và góp ý với mình về hOS và RTOS ở đây. Xin cảm ơn các bạn và chúc vui!

    (To be continued...)
    Attached Files
    Last edited by bvhoang; 06-05-2011, 10:52.

    Comment


    • #3
      Hay quá, chúc mừng bạn. Hy vọng hOS sẽ chứng minh được sự ổn định để trở thành 1 lựa chọn cho RTOS

      Comment


      • #4
        Cho mình hỏi với hOS, mình có thể dùng cấu hình cho thiết bị tiệt kiệm điện không? Thay vì vào stack Idle, thì mình cho MCU ngủ.

        Comment


        • #5
          Nguyên văn bởi thanhnhi Xem bài viết
          Cho mình hỏi với hOS, mình có thể dùng cấu hình cho thiết bị tiệt kiệm điện không? Thay vì vào stack Idle, thì mình cho MCU ngủ.
          Cảm ơn bạn đã có ý kiến đóng góp.

          Thực ra cái này khá đơn giản, và phụ thuộc vào cách tổ chức chương trình của bạn. Khi không có task nào chạy thì Idle task sẽ chạy. Idle task là task mà bạn tự định nghĩa được nội dung của nó. Do đó, trong Idle task, bạn có thể chuyển MCU vào chế độ ngủ để tiết kiệm năng lượng sau khi đã kích hoạt các ngắt ngoài. Khi có ngắt ngoài (UART, SPI, Timer, I/O,...) chương trình ngắt sẽ hoạt động và kích hoạt chạy các task khác bằng các lệnh hosTaskContinue() hoặc hosTaskRestart().

          Comment


          • #6
            Day la mot chu de rat hay ma nam 2004 minh da tung nghien cuu qua va co y dinh (hobby) lam ra 1 HDH da nhiem nhu ban dang lam nhung sau do ko co co hoi gan bo lam code nua nen bo do. Nay thay ban Hoang da lam dc dieu do va share voi moi nguoi vay that tuyet. Xin chuc mung ban va su tiep tuc thanh cong. Ngoai ra minh co mot so y sau hy vong co phan hoi:

            - Mon HDH da nhiem nay va du an tuong tu tren Linux tung dc bac Opendoors nghien cuu va thiet ke chay tren mot so ung dung roi. Vay bac Opendoors nen co chut y kien chang?

            - Kho nhat cua su da nhiem & thoi gian thuc la lam dc viec luu cat lai con tro ham va trang thai hoat dong cua no de nhuong cho Tac vu khac khi den luot va nhan dang, khoi phuc lai dung tac vu + trang thai cua no khi den luot thuc thi. Dong thoi dam bao rang cac thuc thi tac vu do dung thoi gian thuc (theo clock cua cpu). Nhu vay, cho minh hoi ma trinh cua ban da co dam bao viec do ko va gioi han dam bao voi toc do cua clock cpu nhu the nao?

            - Nen tang goc ma nguon cua ban la viet hoan toan moi tu dau boi ban hay dc sua theo cua mot code open source hay cua nguoi khac?
            Last edited by embeonline; 11-05-2011, 13:07.

            Comment


            • #7
              Nguyên văn bởi embeonline Xem bài viết
              Day la mot chu de rat hay ma nam 2004 minh da tung nghien cuu qua va co y dinh (hobby) lam ra 1 HDH da nhiem nhu ban dang lam nhung sau do ko co co hoi gan bo lam code nua nen bo do. Nay thay ban Hoang da lam dc dieu do va share voi moi nguoi vay that tuyet. Xin chuc mung ban va su tiep tuc thanh cong. Ngoai ra minh co mot so y sau hy vong co phan hoi:
              - Mon HDH da nhiem nay va du an tuong tu tren Linux tung dc bac Opendoors nghien cuu va thiet ke cahy tren mot so ung dung roi. Vay bac Opendoors nen co chut y kien chang?
              - Kho nhat cua su da nhiem & thoi gian thuc la lam dc viec luu cat lai con tro ham va trang thai hoat dong cua no de nhuong cho Tac vu khac khi den luot va nhan dang, khoi phuc lai dung tac vu + trang thai cua no khi den luot thuc thi. Dong thoi dam bao rang cac thuc thi tac vu do dung thoi gian thuc (theo clock cua cpu). Nhu vay, cho minh hoi ma trinh cua ban da co dam bao viec do ko va gioi han dam bao voi toc do cua clock cpu nhu the nao?
              - Nen tang goc ma nguon cua ban la viet hoan toan moi tu dau boi ban hay dc sua theo cua mot code open source hay cua nguoi khac?
              Chào anh Tú,

              Em rất vui vì mọi người đã quan tâm và khích lệ. Về 2 cái gạch đầu dòng, em xin trả lời như sau:

              - Về một cơ chế đa nhiệm ổn định, anh có thể yên tâm với hOS. Theo quan điểm cá nhân của em, phần tạo ra cơ chế đa nhiệm không phải là phần khó nhất. Nó chỉ là phần mở đầu, bắt buộc đối với những đơn vị nào muốn tự phát triển hệ điều hành.

              Về vấn đề thời gian thực, em không hiểu ý của anh lắm khi anh nhắc đến clock CPU.

              Bao giờ cũng thế, xét trong khoảng thời gian đủ dài, tốc độ của 1 task khi nó chiếm toàn bộ CPU sẽ nhanh hơn khi nó phải chia sẻ với các task khác. Nếu một người dùng viết 1 vòng lặp để tạo trễ dài, họ sẽ thấy rõ điều này. Ở hOS cũng như các RTOS khác, nếu muốn cho task dừng lại và chờ 1 khoảng thời gian chính xác nào đó, người dùng được khuyến khích dùng hàm sleep hơn là hàm delay. Bộ định thời của RTOS dựa trên một timer nào đó. Do đó có 1 chút liên quan. Nhưng với người dùng RTOS, đơn vị thời gian phổ biến của họ là System Tick. Người sử dụng sẽ phải hiểu khái niệm đó khi họ sử dụng các hàm liên quan đến thời gian. Ví dụ, nếu họ cấu hình sao cho 1 Tick của hệ điều hành tương đương với 0.5 mili giây thì khi đó hàm Sleep(100) sẽ có nghĩa là cho task ngủ 50 mili giây.

              Về vấn đề Realtime, các RTOS được viết ra để xử lý Realtime, nhưng điều đó không có nghĩa là khi người dùng viết ứng dụng trên đó, ứng dụng đó sẽ luôn là Realtime. Việc Realtime hay không phụ thuộc khá nhiều vào cách viết ứng dụng của người dùng nữa. Ngoài cách lập lịch dựa trên chiến lược Weighed Round Robin kết hợp với Priority, hOS cho phép người dùng thay đổi được thuộc tính của các task, qua đó hỗ trợ họ tối đa cho việc đảm bảo Realtime.

              - Về phần nền tảng hOS, anh có thể yên tâm đây là RTOS made in vietnam 100%. Tác giả duy nhất của nó là Bùi Việt Hoàng.

              Mọi thắc mắc và góp ý về hOS, xin mọi người đừng ngần ngại tham gia

              Comment


              • #8
                anh Bùi Việt Hoàng ơi, anh cho em hỏi những file mà anh up lên diễn đàn có phải là lập trình đa nhiệm cho Vi Điều Khiển không?
                em đang học lập trình cho Vi điều khiển em cũng dùng avrstudio để lập trình, nhưng em chỉ mới biết lập trình đơn giản thôi ạ, đọc cái này của anh mới lạ quá em vẫn chưa hiểu rõ về nó lắm, anh có thể giải thích cho e lập trình như của anh có khác gì với cái lập trình em đang học được không?
                anh có thể nêu một vài ứng dụng cho e hiểu rõ hơn được không?

                Comment


                • #9
                  Nguyên văn bởi Quyencv.89 Xem bài viết
                  anh Bùi Việt Hoàng ơi, anh cho em hỏi những file mà anh up lên diễn đàn có phải là lập trình đa nhiệm cho Vi Điều Khiển không?
                  em đang học lập trình cho Vi điều khiển em cũng dùng avrstudio để lập trình, nhưng em chỉ mới biết lập trình đơn giản thôi ạ, đọc cái này của anh mới lạ quá em vẫn chưa hiểu rõ về nó lắm, anh có thể giải thích cho e lập trình như của anh có khác gì với cái lập trình em đang học được không?
                  anh có thể nêu một vài ứng dụng cho e hiểu rõ hơn được không?
                  Hi, chào em.

                  Đấy chính là lập trình đa nhiệm cho vi điều khiển đó, một cách tiếp cận khác với việc lập trình thông thường. Bình thường khi em lập trình, sẽ chỉ có 1 chương trình main chạy tuần tự lệnh này qua lệnh kia. Khi đó em có 1 CPU logic phục vụ hàm main của em. Nhưng với lập trình đa nhiệm, em sẽ có nhiều CPU logic phục vụ nhiều hàm "main" chạy song song. hOS hỗ trợ em làm việc này.

                  Một ví dụ đơn giản là: khi em viết chương trình cho board điều khiển máy giặt, em sẽ phải làm các chức năng sau:
                  1. Nhập thông tin cài đặt từ các nút nhấn
                  2. Phát ra tiếng beep tương ứng với nút nhấn
                  3. Hiển thị trạng thái máy giặt qua đèn LED hoặc màn hình
                  4. Điều khiển động cơ máy giặt
                  5. Điều khiển đóng mở van nước

                  Nếu em viết tất cả trong 1 hàm main thì chương trình sẽ rất rắc rối. Mỗi lần sửa đổi hoặc nâng cấp 1 chức năng nào đó, rất có thể sẽ ảnh hưởng nhiều đến bố cục hàm main và nội dung các chức năng còn lại.
                  Còn nếu em dùng hOS chẳng hạn, em có thể khai báo các nhiệm vụ này trong các hàm riêng biệt. hOS sẽ làm cho chúng chạy song song, đồng thời. Ví dụ, trong hàm điều khiển tốc độ của động cơ, em không cần xen kẽ các lệnh kiểm tra xử lý van nước hay đèn LED nữa. Việc phân phối thời gian được hOS làm tự động.

                  Mà em đang lập trình bằng C hay Assembly vậy?
                  Last edited by bvhoang; 12-05-2011, 11:44.

                  Comment


                  • #10
                    Hi, chào em.

                    Đấy chính là lập trình đa nhiệm cho vi điều khiển đó, một cách tiếp cận khác với việc lập trình thông thường. Bình thường khi em lập trình, sẽ chỉ có 1 chương trình main chạy tuần tự lệnh này qua lệnh kia. Khi đó em có 1 CPU logic phục vụ hàm main của em. Nhưng với lập trình đa nhiệm, em sẽ có nhiều CPU logic phục vụ nhiều hàm "main" chạy song song. hOS hỗ trợ em làm việc này.

                    Một ví dụ đơn giản là: khi em viết chương trình cho board điều khiển máy giặt, em sẽ phải làm các chức năng sau:
                    1. Nhập thông tin cài đặt từ các nút nhấn
                    2. Phát ra tiếng beep tương ứng với nút nhấn
                    3. Hiển thị trạng thái máy giặt qua đèn LED hoặc màn hình
                    4. Điều khiển động cơ máy giặt
                    5. Điều khiển đóng mở van nước

                    Nếu em viết tất cả trong 1 hàm main thì chương trình sẽ rất rắc rối. Mỗi lần sửa đổi hoặc nâng cấp 1 chức năng nào đó, rất có thể sẽ ảnh hưởng nhiều đến bố cục hàm main và nội dung các chức năng còn lại.
                    Còn nếu em dùng hOS chẳng hạn, em có thể khai báo các nhiệm vụ này trong các hàm riêng biệt. hOS sẽ làm cho chúng chạy song song, đồng thời. Ví dụ, trong hàm điều khiển tốc độ của động cơ, em không cần xen kẽ các lệnh kiểm tra xử lý van nước hay đèn LED nữa. Việc phân phối thời gian được hOS làm tự động.

                    Mà em đang lập trình bằng C hay Assembly vậy?
                    em lập trình bằng C, trên avrstudio trình dịch là winAVR.
                    cảm ơn anh!
                    - anh cho em hỏi anh học viết lập trình đa nhiệm cho Vi Điều Khiển có lâu không ạ?
                    - em cũng muốn học và tìm hiểu về cái này anh bảo đầu tiên phải học những gì ?
                    - anh có thể chỉ ra cách tiếp cận theo kiểu lập trình đa nhiệm này cho em được không?
                    - anh có tài liệu hay các trang web hay nói về cái này anh có thể up lên cho mọi người cùng học được không ạ!

                    Comment


                    • #11
                      Nguyên văn bởi Quyencv.89 Xem bài viết
                      em lập trình bằng C, trên avrstudio trình dịch là winAVR.
                      cảm ơn anh!
                      - anh cho em hỏi anh học viết lập trình đa nhiệm cho Vi Điều Khiển có lâu không ạ?
                      - em cũng muốn học và tìm hiểu về cái này anh bảo đầu tiên phải học những gì ?
                      - anh có thể chỉ ra cách tiếp cận theo kiểu lập trình đa nhiệm này cho em được không?
                      - anh có tài liệu hay các trang web hay nói về cái này anh có thể up lên cho mọi người cùng học được không ạ!
                      Hi,

                      Ngày xưa tài liệu còn khan hiếm nên mọi người mới hay có kiểu up lên cho anh em biết. Bây giờ chỉ cần google là em có thể thoải mái lựa chọn và đọc tài liệu, Tây, Ta đều có cả.

                      Tuy nhiên anh khuyên em nên bắt đầu từ chính luồng này. Ở đây em vừa được học lý thuyết, thực hành, và được giải đáp thắc mắc về hOS.
                      Một khi em đã thành thạo với những khái niệm tổng quát và làm thực tế với hOS thì việc tiếp cận với những hệ điều hành khác cũng sẽ rất dễ dàng.

                      Em hãy đọc thật kĩ bài thứ 2 anh post ở trên (Hướng dẫn lập trình với hOS). Sau đó em down code của anh về và nghiên cứu file hosDemo.C, rồi sửa đổi, thêm bớt, dịch thử theo ý của em, nạp chạy thử hoặc mô phỏng bằng proteus. Nếu có chỗ nào chưa hiểu về các khái niệm, rồi tại sao lại có cái này, có cái kia,... em cứ lên đây hỏi anh. Anh sẽ trả lời. Và anh nghĩ là những câu hỏi của mọi người và những giải đáp của anh (và có thể của người khác nữa) sẽ làm cho những người mới bắt đầu hiểu rõ hơn về cách thức lập trình đa nhiệm với RTOS, đồng thời có cơ hội để thực hành với 1 RTOS cụ thể (hOS).

                      Em còn chờ gì nữa, hãy bắt đầu thôi!

                      Comment


                      • #12
                        Hi Hoàng,
                        Nguyên văn bởi bvhoang Xem bài viết
                        - Về một cơ chế đa nhiệm ổn định, anh có thể yên tâm với hOS. Theo quan điểm cá nhân của em, phần tạo ra cơ chế đa nhiệm không phải là phần khó nhất. Nó chỉ là phần mở đầu, bắt buộc đối với những đơn vị nào muốn tự phát triển hệ điều hành.

                        Về vấn đề thời gian thực, em không hiểu ý của anh lắm khi anh nhắc đến clock CPU.
                        clock CPU có thể coi là System Tick của bạn. clock CPU = N * System Tick.
                        Cơ chế đa nhiệm này như bạn đã đề cập, có thể do trình biên dịch tự tạo ra (trình biên dịch đã hỗ trợ sẵn các hàm về tiến trình & phân quyền & tương tác... của các tiến trình) hoặc phải được code phát triển (build) bởi chính nhà phát triển/ xây dựng HDH (bắt đầu từ số 0 với các mã lệnh Assembly và/ hoặc hàm C chuẩn được hỗ trợ bởi chương trình dịch). => Vậy cơ chế của hOS theo cách nào ?

                        Mình chưa thấy các xử lý liên quan đến khả năng hỗ trợ tương tác, đồng bộ hoạt động giữa các tiến trình; Tức là vấn đề sử dụng hàng đợi thông điệp (Message Queu) cho phối hợp/ đồng bộ công việc giữa các tác vụ?

                        hOS đã đảm bảo được việc hoạt động đa nhiệm nhưng có đảm bảo các tiến trình (nhiệm) hoạt động song song được và trong thời gian thực hay kô ? Xem ở demo các chuỗi xung logic o/1 được tạo ra liên tục ở các Pins quan sát thấy có đan xen lẫn nhau không ? Nếu thử cho các Task đều thao tác tạo xung chỉ trên 1 Pin thôi thì quan sát thế nào ?

                        Khả năng về thời gian thực (Real Time) tức là xét tới tính tối ưu mã và thiết kế hệ thống của hOS, trong một cấu trúc đa tác vụ tối thiểu nhất thì các tần số đồng hồ clock CPU và System Tick bao nhiêu nó vẫn đảm bảo hoạt động tốt kô treo loạn ?

                        Hoàng sẽ nên có một soạn thảo lại thành một bài viết như là cho đăng báo để giới thiệu hOS. Mình sẽ giúp đăng trên trang www.EMBEonline.com để lưu trữ và quảng bá cho mọi người quan tâm, ứng dụng sẽ hiệu quả hơn, vì đăng trên diễn đàn này có thể 1 thời gian sau sẽ bị lãng quên.

                        Comment


                        • #13
                          Bạn có ý định biến hOS thành free open source software hay ko?
                          Hay mục đích của hOS là thương mại, bán source code?
                          Mình thấy topic đang mang nội dung demo/quảng cáo sản phẩm.

                          Comment


                          • #14
                            Nguyên văn bởi T&AGroup Xem bài viết
                            Bạn có ý định biến hOS thành free open source software hay ko?
                            Hay mục đích của hOS là thương mại, bán source code?
                            Mình thấy topic đang mang nội dung demo/quảng cáo sản phẩm.
                            Hi,

                            Bạn kiểm tra lại đi. Demo ở đây là ứng dụng demo, ví dụ ứng dụng phát xung, truyền thông,... viết trên AVRStudio, dịch bằng AVRGCC.
                            Còn cái lõi nanokernel là miễn phí hoàn toàn mọi người có thể tải về dùng thoải mái, không bị hạn chế gì cả.

                            Theo mình hiểu, Demo không có nghĩa là thương mại.
                            Demo đơn giản trưng ra những đặc tính cơ bản của nó để giải quyết một số vấn đề cốt lõi mà mọi người mong đợi.
                            Với một sản phẩm miễn phí, người tạo ra nó cũng có quyền làm một Demo để giới thiệu cho nó chứ.

                            Về open source, không có vấn đề gì cả. Nhưng mình sẽ open dần dần vì cái gì cũng có quá trình mà.

                            Comment


                            • #15
                              Nguyên văn bởi embeonline Xem bài viết
                              Hi Hoàng,

                              clock CPU có thể coi là System Tick của bạn. clock CPU = N * System Tick.
                              Cơ chế đa nhiệm này như bạn đã đề cập, có thể do trình biên dịch tự tạo ra (trình biên dịch đã hỗ trợ sẵn các hàm về tiến trình & phân quyền & tương tác... của các tiến trình) hoặc phải được code phát triển (build) bởi chính nhà phát triển/ xây dựng HDH (bắt đầu từ số 0 với các mã lệnh Assembly và/ hoặc hàm C chuẩn được hỗ trợ bởi chương trình dịch). => Vậy cơ chế của hOS theo cách nào ?

                              Mình chưa thấy các xử lý liên quan đến khả năng hỗ trợ tương tác, đồng bộ hoạt động giữa các tiến trình; Tức là vấn đề sử dụng hàng đợi thông điệp (Message Queu) cho phối hợp/ đồng bộ công việc giữa các tác vụ?

                              hOS đã đảm bảo được việc hoạt động đa nhiệm nhưng có đảm bảo các tiến trình (nhiệm) hoạt động song song được và trong thời gian thực hay kô ? Xem ở demo các chuỗi xung logic o/1 được tạo ra liên tục ở các Pins quan sát thấy có đan xen lẫn nhau không ? Nếu thử cho các Task đều thao tác tạo xung chỉ trên 1 Pin thôi thì quan sát thế nào ?

                              Khả năng về thời gian thực (Real Time) tức là xét tới tính tối ưu mã và thiết kế hệ thống của hOS, trong một cấu trúc đa tác vụ tối thiểu nhất thì các tần số đồng hồ clock CPU và System Tick bao nhiêu nó vẫn đảm bảo hoạt động tốt kô treo loạn ?

                              Hoàng sẽ nên có một soạn thảo lại thành một bài viết như là cho đăng báo để giới thiệu hOS. Mình sẽ giúp đăng trên trang www.EMBEonline.com để lưu trữ và quảng bá cho mọi người quan tâm, ứng dụng sẽ hiệu quả hơn, vì đăng trên diễn đàn này có thể 1 thời gian sau sẽ bị lãng quên.
                              Hi, cám ơn anh Tú đã có nhã ý. Em rất vui nếu anh giúp đỡ em việc quảng bá nó với giới lập trình.

                              Về vấn đề trình biên dịch, nó không liên quan mấy đến thuật toán triển khai đa nhiệm của em. Em chỉ khai thác một điểm ở trình biên dịch, đó là trình biên dịch biết nên push và pop các thanh ghi nào của CPU, do đó, em không tự mình push và pop tất cả các thanh ghi nữa (trong khi các RTOS khác vẫn làm theo kiểu này). khi đó, nhìn chung thời gian chuyển task sẽ nhanh hơn.

                              Về các vấn đề khác liên quan đến đa nhiệm, anh cứ yên tâm. Em đã giải quyết, và đang định tiếp tục với các bài viết và ví dụ về Semaphore/Mutex, Timer, Queue/Message/Mailbox/Port. Nhưng để soạn một bài hướng dẫn có đủ cả lý thuyết và ví dụ ứng dụng cũng mất khá nhiều thời gian. Nếu mọi người thực sự có hứng thú với cái nanokernel kia thì em mới tiếp tục.

                              Vấn đề về system tick, realtime cần một bảng thống kê chi tiết với từng loại MCU, từng tốc CPU,... để mọi người hiểu cấu hình nó như thế nào thì hợp lý. Em sẽ trình bày chi tiết hơn trong những bài viết tới.

                              Thanks again!
                              Last edited by bvhoang; 13-05-2011, 21:24.

                              Comment

                              Về tác giả

                              Collapse

                              bvhoang Tìm hiểu thêm về bvhoang

                              Bài viết mới nhất

                              Collapse

                              Đang tải...
                              X