Sự khác biệt của ngôn ngữ lập trình ARM

Dưới đây là sự khác biệt trong ngôn ngữ lập trình ARM so với các loại ngôn ngữ lập trình khác về cách xử lí dữ liệu và truyền dữ liệu nội bộ.

Sự khác biệt của ngôn ngữ lập trình ARM

Lập trình MCU ARM – Sự khác biệt so với các ngôn ngữ lập trình khác

Có rất ít kỹ sư hay những người đam mê điện tử bắt đầu lập trình với vi điều khiển ARM. Hầu hết họ đến với ARM để tìm kiếm khả năng xử lý cao hơn, với nền tảng đơn giản là MCU 8 bit.

Trong bài viết trước về cách thiết lập và cài đặt môi trường phát triển cho ARM , đã chỉ ra cách thiết lập các công cụ ARM của Keil để có thể biên dịch chương trình và tạo tệp đầu ra. Tuy nhiên, trước khi bạn tiến hành viết chương trình cho vi điều khiển ARM, điều quan trọng là phải biết một số khác biệt giữa ARM và AVR, 8051 hoặc PIC mà bạn đã lập trình trước đây.

Có một số sự khác biệt cơ bản trong cách xử lý dữ liệu và truyền dữ liệu nội bộ. Biết những khác biệt này sẽ giúp đơn giản hóa sự hiểu biết về phần cứng ARM cho những người đã lập trình vi điều khiển 8 bit trong quá khứ.

Kích thước thanh ghi dịch

Sự khác biệt lớn đầu tiên bạn sẽ nhận thấy là  kích thước của các thanh ghi. Đối với AVR hoặc các bộ vi điều khiển 8 bit khác, kích thước thanh ghi người dùng có thể truy cập gần như luôn là 8 bit. Các thanh ghi phải chứa dữ liệu 16 bit thường được truy cập dưới dạng một byte cao và một byte thấp. Nó yêu cầu hai lần truy cập để đọc dữ liệu 16 bit.

Điều này khác ở ARM. Lõi ARM có 32 bit và hiệu quả nhất khi được sử dụng ở chế độ 32 bit. Do đó, hầu hết tất cả các địa chỉ thanh ghi đều có chiều rộng 4 byte (32 bit). Ví dụ: để bật tất cả các chân của cổng D là đầu ra, bạn sẽ viết

DDRD = 0xFF; // Đặt tất cả 8 chân làm đầu ra

Nhưng trên ARM, để tất cả các chân của cổng 0 thành đầu ra, bạn sẽ viết

IO0DIR = 0xFFFFFF; // Đặt tất cả 32 chân làm đầu ra

Lưu ý rằng số chân cổng có thể nằm trong khoảng từ Pn.0 đến Pn.31, vì các cổng I/O rộng 32 bit. Tất nhiên, không phải tất cả các chân đều có thể có sẵn bên ngoài – giống như với các bộ vi điều khiển 8 bit.

Quá trình chuyển một chân lên mức cao mà không ảnh hưởng đến các chân còn lại trên AVR là:

·         Lấy nội dung của thanh ghi đầu ra

·         OR với dữ liệu nhị phân của chân bạn muốn SET (đặt thành ‘1’)

·         AND với  tổ hợp dữ liệu nhị phân của chân bạn muốn RESET (xóa hoặc đặt thành ‘0’)

·         Viết kết quả trở lại thanh ghi đầu ra.

 

Quá trình này được gọi là trình tự đọc-sửa đổi-ghi và nó rất tốn thời gian vì quá nhiều bước. ARM giải quyết vấn đề này bằng cách làm cho nó có sẵn trong phần cứng. Thay vì thanh ghi PORTn để ghi giá trị bit của tất cả các chân, vi điều khiển ARM cung cấp các thanh ghi bit che như IOnSET và IOnCLR. Viết ‘1’ cho bất kỳ bit nào của thanh ghi sẽ xóa hoặc đặt bit và để các bit khác không bị ảnh hưởng. Điều này cho phép bật và điều khiển I / O rất nhanh (trên 15 MHz).

Cấu trúc hệ thống

 

Module điện tử 932*50

Dưới đây chúng ta sẽ xem xét LPC214x (Bán dẫn NXP) để minh họa cách các phần được tổ chức trong vi điều khiển ARM7.

Mạng đường trục trung tâm có thể được chú ý ngay lập tức là VPB (BUS ngoại vi VLSI). Nếu bạn quan sát đường BUS trong sơ đồ khối, bạn sẽ nhận thấy rằng nó bắt nguồn từ AHB (Bus hiệu suất cao nâng cao). AHB chạy ở cùng tốc độ xung nhịp với lõi ARM7TDMI-S chính. VPB có xung clock từ AHB và tốc độ xung có thể được giảm xuống bằng cách sử dụng bộ chia. VPB kết nối tất cả các thiết bị ngoại vi với lõi. Do đó, các thiết bị ngoại vi chạy ở tốc độ thấp hơn hoặc bằng tốc độ của lõi ARM.

Tuy nhiên, bộ điều khiển ngắt và USB DMA (truy cập bộ nhớ trực tiếp) chạy cùng tốc độ với lõi. Điều này cho phép xử lý nhanh các ngắt và truyền dữ liệu USB. 

Biết cấu trúc này làm cho vi điều khiển ARM có vẻ đơn giản hơn để lập trình, vì mỗi khối này rất dễ vận hành. Ngoài ra, việc biết cấu trúc này rất quan trọng đối với các ứng dụng lập trình mà không gặp phải các trường hợp ngoại lệ hoặc lỗi thời gian .

Thời gian

Bộ vi điều khiển ARM được tích hợp lõi ARM và các thiết bị ngoại vi như hình trên. Các thiết bị ngoại vi được tích hợp cẩn thận với lõi. Nhưng các thiết bị ngoại vi cũng được phân tách rõ ràng về nguồn và tốc độ xung clock. Do đó, có thể dễ dàng gây ra vấn đề thời gian mà phần mềm không nhận ra điều gì đang xảy ra. Do đó gỡ lỗi chương trình sẽ rất ít khi chỉ ra vấn đề này.

Để hiểu điều này, xét ví dụ phải phát hiện xung 0,3us (micro giây) hoặc lâu hơn bằng cách sử dụng ngắt ngoài. Giả sử rằng bộ lọc ngắt bên ngoài loại bỏ các xung có chiều rộng nhỏ hơn 8 chu kỳ xung nhịp khi mà trục trặc có thể xảy ra. Do đó, để phát hiện xung 0,3us, tốc độ xung nhịp tối thiểu là

8 / (0,3us) = ~ 27 MHz

Để có độ tin cậy cao hơn, hãy sư dụng xugn nhịp ở tần số 30 MHz.

Vì vậy, bạn có thể đặt CPU và tốc độ bộ điều khiển ngắt thành 30 MHz để có thể phát hiện xung này bằng cách sử dụng ngắt ngoài. Nhưng điều này có thể KHÔNG hoạt động!

Nguyên nhân là vì phần cứng ngắt ngoài được đặt trên VPB. Bất kể tần số bộ xử lý và tốc độ của VIC (bộ điều khiển ngắt), bạn cần bước xung nhịp VPB là 30 MHz để phát hiện xung này. Điều này là do phần cứng ngắt ngoài chứa bộ lọc trục trặc xuất phát từ xung của VPB, không phải xung hệ thống.

Các vấn đề nhỏ như thế này trở nên rất khó để gỡ lỗi, đặc biệt là trong trường hợp giao tiếp nối tiếp tốc độ cao.

 

Các địa chỉ thanh ghi phải được truy cập với sự điều chỉnh Word. Truy cập nửa word hoặc byte không được phép. Ví dụ: bạn có thể đọc một từ (32 bit) từ một thanh ghi nằm ở 0x40000000 và 0x40000004. Nhưng bạn không thể ghi vào địa chỉ 0x40000002.

Điều này là do logic giải mã địa chỉ trong hầu hết các chip không triển khai phần cứng làn đường byte cần thiết cho truy cập độc lập ranh giới. Điều tốt là, đây không phải là một vấn đề lớn và nó làm giảm chi phí sản xuất! Bộ công cụ dây chuyền sẽ hỗ trợ các quy tắc truy cập cho bạn khi bạn lập trình bằng C hoặc các ngôn ngữ cấp cao khác.

Ngoài ra, địa chỉ 32 bit có nghĩa là có không gian địa chỉ là 4GB! Rất ít trong số các địa chỉ này thực sự được sử dụng và cố gắng truy cập các địa chỉ không chứa thanh ghi hoặc bộ nhớ sẽ gây ra ngoại lệ hủy bỏ chu kỳ đường BUS và sẽ gây ra thiết lập lại nếu mã của bạn không xử lý ngoại lệ đúng cách. Vì lý do này, chúng tôi khuyên bạn không nên ghi ‘1’ vào các bit dành riêng hoặc truy cập các địa chỉ chưa được ánh xạ.

Thông thường, không có gì xảy ra trên hầu hết các MCU 8 bit khi truy cập bất hợp pháp được thực hiện. Trong trường hợp xấu nhất  một thanh ghi dịch không liên quan có thể bị ảnh hưởng hoặc ghi đè. Nhưng trên MCU ARM, mọi hành vi mã bất hợp pháp sẽ gây ra ngoại lệ. Chúng phải được xử lý bởi mã người dùng.

 

Trong  công cụ Keil, các ngoại lệ chỉ gây ra một vòng lặp vô hạn hoặc đặt lại theo mặc định – đây là cách an toàn nhất để xử lý một ngoại lệ. Điều này có thể được thay đổi bằng cách sửa đổi mã lắp ráp trong một tệp khởi động, sẽ được đề cập trong nhiều bài viết tiếp theo.

 

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *