Sự khác biệt về lập trình giữa Vi điều khiển và Vi xử lý?


9

Vì vậy, tôi thường thấy sách / hướng dẫn và tài liệu tham khảo khi lập trình lắp ráp thành bộ vi xử lý ..... sau đó tôi thấy một số người coi nó là vi điều khiển.

Ví dụ, Atmel ATtiny2313 .... tôi đã thấy một số hướng dẫn trên, một số gọi nó là bộ vi xử lý, một số gọi nó là vi điều khiển?

Đó là cái gì và lập trình chúng (về cơ bản) có giống nhau không? (lắp ráp)



1
@Kellenjb: Sẽ là nếu nó không hỏi về sự khác biệt trong lập trình. Tôi nghĩ rằng điều này là đủ khác nhau để không đóng cửa.
BG100

1
@ BG100 câu trả lời được chấp nhận chỉ thực sự giải thích sự khác biệt, không phải là sự khác biệt về lập trình.
Kortuk

Câu trả lời:


14

Đây thực sự là hai câu hỏi trong một ...

Thứ nhất, sự khác biệt giữa vi điều khiển và vi xử lý là gì?

Bộ vi xử lý hoàn toàn là một CPU tuân theo một tập hợp các lệnh được đọc từ một bus bộ nhớ ngoài. Nó kiểm soát các thiết bị ngoại vi bên ngoài (như màn hình, bàn phím, chuột, ổ cứng, v.v.) thông qua một bus truyền thông bên ngoài. Khi bạn lập trình một bộ vi xử lý, chương trình của bạn nằm ngoài thiết bị. Trong máy tính, bộ nhớ này ban đầu là ROM ROM khởi động, ban đầu đọc hệ điều hành từ ổ cứng vào bộ nhớ RAM, sau đó tiếp tục thực thi nó từ đó.

Vi điều khiển giống như một CPU + Bộ nhớ tất cả trong một, với một số cổng bên ngoài để giao tiếp với thế giới bên ngoài. Nó khép kín và không sử dụng bộ nhớ ngoài để giữ chương trình (mặc dù nếu cần, nó có thể đọc và ghi dữ liệu làm việc vào bộ nhớ ngoài).

Thứ hai, lập trình vi điều khiển và vi xử lý có giống nhau không?

Trong một số cách có, và trong một số cách không.

Ngôn ngữ hội là một thuật ngữ rộng mô tả một tập các hướng dẫn mà CPU có thể hiểu trực tiếp. Khi bạn biên dịch ngôn ngữ hợp ngữ, nó không thực sự biên dịch bất cứ thứ gì, tất cả nó sẽ chuyển đổi nó thành một chuỗi byte đại diện cho các lệnh và cắm vào một số vị trí bộ nhớ tương đối. Điều này là phổ biến cho cả bộ vi xử lý và vi điều khiển.

Tuy nhiên, các loại CPU khác nhau hiểu một bộ hướng dẫn CPU khác nhau. Ví dụ, nếu bạn viết chương trình hợp ngữ hoạt động với bộ vi điều khiển pic 16F877, nó sẽ hoàn toàn vô nghĩa với bộ vi xử lý hoặc bất kỳ bộ vi điều khiển nào khác bên ngoài họ vi điều khiển pic 16Fxxx.

Vì vậy, mặc dù lắp ráp hoạt động theo cách tương tự trên tất cả các bộ vi xử lý và vi điều khiển, danh sách hướng dẫn thực tế mà bạn viết rất khác nhau. Để viết bằng ngôn ngữ lắp ráp, bạn cần có kiến ​​thức chuyên sâu về kiến ​​trúc của thiết bị, mà bạn thường có thể nhận được từ biểu dữ liệu trong trường hợp vi điều khiển.


Chà, ý của tôi là ASM sẽ khác nhau đối với mỗi người ..... nhưng các lệnh / etc nói chung giống nhau (hoặc được thực hiện theo cùng một cách) giữa MC và MP ... Ý tôi là MC có MP vì vậy tôi sẽ giả sử như vậy .. (trừ bộ nhớ)

@Sauron: Không, không thực sự .. trong khi một số lệnh có thể giống nhau giữa các thiết bị, như add, Mov, sub, v.v., chúng có thể được triển khai khác nhau và sẽ không chuyển giữa các thiết bị.
BG100

1
Trả lời tuyệt vời, và một điều có lẽ có thể đã giúp tôi khi tôi bắt đầu lớp vi xử lý của mình.
pfyon

ý tôi muốn nói là ...... Giống như vì Vi điều khiển có CPU bên trong nó ... các hướng dẫn lắp ráp nhắm vào CPU thực tế hơn là các thành phần xung quanh nó.

@Sauron: Vâng, đúng rồi.
BG100

10

Sự khác biệt là bộ vi điều khiển bao gồm bộ nhớ trên chip như Flash EEPROM và RAM, và các thiết bị ngoại vi như I / O song song và nối tiếp. Với các bộ vi xử lý đầu tiên, tất cả đều là thiết bị bên ngoài. Thay vì các bộ vi xử lý của I / O có một địa chỉ và bus dữ liệu được mang đến các chân của chúng.
Cách bạn viết mã cho một trong hai là như nhau.

Để minh họa điểm đó: có các kiến ​​trúc (ví dụ ARM) trong đó cùng một CPU có sẵn như vi điều khiển (với tất cả bộ nhớ mã và dữ liệu trên chip), như bộ vi xử lý (tất cả bộ nhớ mã và dữ liệu bên ngoài) hoặc dưới dạng lai (một số bộ nhớ trên chip, nhưng đối với hầu hết các ứng dụng, bạn sẽ thêm bộ nhớ ngoài). CPU là như nhau, vì vậy lập trình (theo nghĩa của hướng dẫn CPU) là như nhau.


Oh ok điều đó có ý nghĩa hơn, nhưng ASM cho mỗi người về cơ bản là giống nhau?

Ý bạn là nếu tôi học cách viết mã cho sê-ri Cortex M, thì tôi cũng có thể mã cho sê-ri Cortex A ??
0xakhil

Về cơ bản có cho cả hai câu hỏi, các hướng dẫn asm đều giống nhau (mặc dù có thể có các biến thể nhỏ, giống như các phiên bản ARM khác nhau có thể thêm các hướng dẫn cụ thể). Nhưng bất cứ khi nào bạn đang sử dụng những thứ bên ngoài CPU (bộ đệm, bộ điều khiển ngắt, thiết bị ngoại vi, v.v.) sẽ có sự khác biệt lớn.
Wouter van Ooijen

8

Mặc dù đây có xu hướng là một vùng màu xám, nhưng một điểm khác biệt phổ biến khác giữa vi điều khiển và vi xử lý là vi điều khiển thường sử dụng kiến trúc Harvard (không gian địa chỉ riêng cho mã và dữ liệu), trong khi hầu hết các vi xử lý đều sử dụng kiến trúc Von Neumann (không gian địa chỉ kết hợp cho mã và dữ liệu) .

Ví dụ về các họ micront điều khiển sử dụng kiến ​​trúc Harvard bao gồm: AVR, Intel 8051, PIC (trừ PIC32, xem bên dưới) và ARM Cortex-M3. Một ngoại lệ đáng chú ý là bộ xử lý Freescale, như HCS08, sử dụng kiến ​​trúc Von Neumann, cũng như Parallax Propeller.

Điều này ảnh hưởng đến lập trình theo nhiều cách (ví dụ hiển thị bên dưới sử dụng C):

Có thể có một số loại RAM, mỗi loại có không gian địa chỉ riêng. Ví dụ, 8051 có dữ liệu ngoài (xdata) được xử lý tách biệt với 256 byte RAM đầu tiên, mặc dù cả hai đều được thực hiện trên cùng một chip. Vì vậy, người ta phải sử dụng vòng loại trên các khai báo biến nhưunsigned int xdata foo;

Nếu các hằng số được khai báo trong bộ nhớ mã, chúng có thể cần được sao chép vào RAM trước khi chúng có thể được truy cập. Hoặc, cần có một cách để truy cập bộ nhớ mã như thể đó là dữ liệu - ví dụ: vòng loại mã cho 8051 hoặc tính năng Visiblity không gian chương trình (PSV) của PIC.

Những cách truy cập mã và RAM không chuẩn này có xu hướng là sự khác biệt chính (bên cạnh các thiết bị ngoại vi) khi chuyển mã C từ họ chip này sang họ chip khác.

Bạn không thể thực thi mã từ RAM trong một kiến ​​trúc nghiêm ngặt của Harvard, do đó không thể có bất kỳ mã tự sửa đổi nào (trừ khi bạn đếm lại bộ nhớ chương trình nhấp nháy khi đang di chuyển). Tuy nhiên PIC32 có kiến ​​trúc Harvard được sửa đổi cho phép mã được thực thi trong RAM. Parallax Propeller thực sự sử dụng khả năng sửa đổi mã của nó để thực hiện trả về chương trình con, vì nó không có ngăn xếp phần cứng.


1

Một vi điều khiển nói chung là một giải pháp đơn chip để cung cấp các chức năng tính toán và ngoại vi.

Một bộ vi xử lý cung cấp các hàm tính toán nhưng không phải là các hàm ngoại vi.

Các chức năng ngoại vi có thể đơn giản như có một vài bit I / O đơn giản; hoặc có thể bao gồm bộ đếm và bộ hẹn giờ tinh vi, hiển thị video, ethernet, điều khiển động cơ, codec âm thanh và video, et cetra.

Đối với một kiến ​​trúc nhất định (giả sử CPU của CPU và MCU dựa trên x86), mã hóa "tính toán" sẽ giống hệt nhau. Nhưng cách bạn truy cập các chức năng ngoại vi sẽ khác nhau và do đó bạn sẽ có mã hóa phần cứng rất khác nhau để làm, dựa trên cách chức năng ngoại vi được triển khai trên phần cứng mục tiêu của bạn.


1

Bộ vi xử lý thường được sử dụng trong các máy tính được xây dựng để chạy các chương trình có mục đích tùy ý chưa được xác định. Các máy tính như vậy thường sẽ có một số mã do nhà cung cấp cung cấp, trong đó mã do người dùng cung cấp sẽ được dự kiến ​​sẽ tương tác. Ngược lại, vi điều khiển thường được sử dụng trong các máy được chế tạo cho mục đích duy nhất là chạy một chương trình duy nhất. Thông thường, ai đó viết mã cho vi điều khiển sẽ cung cấp mọi lệnh đơn mà máy sẽ thực thi.

Một số bộ vi điều khiển sử dụng các bộ hướng dẫn tương tự như các bộ vi xử lý phổ biến. Tập lệnh 68000 được sử dụng trong các dòng máy tính cá nhân Macintosh, Amiga và Atari ST ban đầu cũng đã được sử dụng trong một số bộ vi điều khiển. Mặc dù tập lệnh được sử dụng bởi Macintosh và bảng điều khiển dựa trên 68HC340 là như nhau, tuy nhiên, lập trình cho hai nền tảng có thể rất khác nhau. Trên Macintosh, vào thời điểm chương trình do người dùng cung cấp bắt đầu chạy, phần lớn hệ thống sẽ được "thiết lập". Mã muốn một khối bộ nhớ có thể tải một thanh ghi với số lượng cần thiết và thực hiện lệnh "A-bẫy". Hệ điều hành Macintosh sau đó sẽ trả về một con trỏ tới một số bộ nhớ chưa được phân bổ trước đó cho một số mục đích khác và đánh dấu vùng nhớ đó để nó giành chiến thắng ' t được phân bổ lại cho đến khi được hướng dẫn rằng người nhận ban đầu không còn cần nó nữa. Ngược lại, trên một bo mạch có 68HC340 và 128K RAM, không có nhu cầu hoặc khả năng "yêu cầu" RAM. Khi chương trình bắt đầu, sẽ "được" 128K, nó có thể sử dụng theo ý muốn; không có gì khác sẽ sử dụng nó, nhưng mặt khác, chương trình của người dùng phải theo dõi những lĩnh vực mà nó sử dụng cho mục đích gì vì không có gì khác sẽ theo dõi điều đó.

Mặc dù sự khác biệt ở đây thực sự là giữa máy vi tính so với vi điều khiển và câu hỏi là về bộ vi xử lý, hầu hết các cuộc thảo luận về lập trình vi xử lý đều thảo luận về nó trong bối cảnh của một máy tính đa năng.


0

Bộ vi xử lý: Một mô-đun phần cứng kỹ thuật số thực hiện các hướng dẫn. Các mô-đun có thể là một mạch tích hợp hoàn chỉnh.

Vi điều khiển: Một mô-đun hoàn chỉnh có chứa bộ vi xử lý với bộ nhớ trong bên cạnh các mô-đun khác.


Chào mừng đến với EE.SE, Mike. Sử dụng <enter> x 2 để ngắt đoạn. Tôi đã sửa nó cho bạn.
Transitor
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.