Thực hiện các hướng dẫn từ RAM trong một vi điều khiển thân thiện với sở thích


12

Một trong những dự án của tôi sẽ được hưởng lợi rất nhiều từ việc có thể chạy một chương trình không được lưu trữ trong vi điều khiển (nhưng thay vào đó được lưu trữ trong thẻ SD).

Vì vậy, tôi đang tìm kiếm một thiết bị cho phép tôi tải mã từ thẻ SD vào RAM và sau đó thực thi mã từ RAM. Hiện tại, tôi chỉ có lập trình viên đi kèm với PicKit2, vì vậy tôi thích ở lại với PIC hơn.

Có ai biết, nếu có, PIC có thể làm điều này? Nếu không có PIC nào có khả năng này, thì một số bộ điều khiển vi mô khác nhau sẽ hoạt động cho việc này là gì? Tốt nhất là những cái có sẵn trong một gói tương thích.


2
huh? ... Chính xác thì bạn cần phải thực hiện từ ram để làm gì? và 'tĩnh' nghĩa là gì? Bạn không thực sự cố gắng để viết mã tự sửa đổi phải không? Bạn đang nói về việc thiếu phân bổ bộ nhớ động? aka không có malloc?
Đánh dấu

2
@Mark Tôi muốn có thể tải một chương trình từ một thiết bị bên ngoài, chẳng hạn như thẻ SD và thực hiện nó. Tôi sẽ cố gắng giải thích rõ hơn trong bài viết của mình.
Ponkadoodle

2
gotcha, PIC duy nhất mà tôi biết sẽ cho phép đây là PIC32. Trừ khi bạn làm điều gì đó điên rồ như sao chép nó từ thẻ SD sang flash, điều này sẽ ăn chu kỳ flash khá nhanh nếu chương trình chuyển đổi của bạn thường xuyên. Hầu hết uC 8 / 16bit nhỏ được phân chia nhiều giữa không gian dữ liệu (ram) và không gian chương trình (flash) và không cho phép bộ đếm chương trình xử lý ram (kiến trúc Harvard, không bảo vệ bộ nhớ, v.v.).
Đánh dấu

Câu trả lời:


5

Có một vài PIC cho phép bạn thêm bộ nhớ chương trình bên ngoài. Tôi chưa bao giờ làm điều này nhưng Ghi chú ứng dụng AN869AN778 có thêm thông tin về cách triển khai bộ nhớ ngoài.


11

Một tùy chọn khác để xem xét là sử dụng ngôn ngữ được dịch cho các chương trình của bạn được lưu trên thẻ SD. Bằng cách này, bộ xử lý không thực thi mã máy đọc từ thẻ, nó chỉ coi nó là dữ liệu.

Cách tiếp cận này cho phép bạn linh hoạt với chi phí tốc độ.

Có rất nhiều tùy chọn để lựa chọn: Khảo sát Trình thông dịch / Trình biên dịch ngôn ngữ cấp cao cho Vi điều khiển


1
Cuộn DSL của riêng bạn. Tùy chọn này hấp dẫn tôi nhất trong tất cả các giải pháp được đề xuất.
A-mốt

6

Như đã nói, PIC (trừ PIC32) không thể làm điều này. Bạn có thể sẽ phải đến các bộ xử lý lớn hơn trong bất kỳ gia đình nào hoặc tới bộ xử lý có bus bộ nhớ ngoài vì hầu hết các bộ vi điều khiển có tài nguyên RAM rất hạn chế.

Bộ xử lý MSP430 có thể chạy mã từ không gian RAM của chúng nhưng bạn sẽ cần một cái gì đó như F5438 với dung lượng RAM 16k - mã chạy trong 128 byte không thực sự là một tùy chọn!

Nếu bộ xử lý có bus ngoài thì bạn có thể đặt RAM vào không gian mã. Bạn có thể phải thêm một số logic bổ sung để ánh xạ RAM vào hai vùng bộ nhớ nếu kiến ​​trúc bộ xử lý không cho phép ghi dữ liệu vào bộ nhớ thực thi.

Tôi đã chạy mã từ RAM trong hệ thống dựa trên 8051 nhưng điều đó có nghĩa là RAM phải được ánh xạ vào không gian bộ nhớ EXTERN để lập trình và sau đó quay lại không gian CODE để thực thi. Chương trình nạp / giám sát đã xử lý việc chuyển đổi và tải ngân hàng bộ nhớ. Xin đừng hỏi mã - Tôi đã làm điều này khoảng 30 năm trước và nó đã bị mất từ ​​lâu (và được viết bằng PL / M-51)


5

Không ai trong số các PIC tầm trung và thấp có thể thực thi từ RAM vì kiến ​​trúc bộ nhớ của chúng.

Bất kỳ CPU dựa trên ARM nào cũng phải thực thi từ RAM. Mặc dù chúng có xu hướng nằm trong các gói smd, nhưng có khá nhiều mô-đun kích thước 'DIP' có bộ vi điều khiển đã được tải. Hãy nhìn vào chiếc cốc hoặc LPCXpresso chẳng hạn. Cả hai đều đi kèm với bộ tải khởi động hoặc, trong trường hợp LPCXpresso, giao diện gỡ lỗi cùng với trình biên dịch miễn phí.

Nếu bạn muốn ở lại với micros 8 bit đơn giản, có lẽ nên xem xét một cái gì đó từ Gia đình HCS08 tự do. Chúng có thể thực thi từ RAM và có một phiên bản giới hạn mã của trình biên dịch IDE và C mã hóa miễn phí.

Tôi khá chắc chắn rằng MPS430 cũng có thể làm điều này, nhưng tôi chưa bao giờ tự làm điều đó.


Các mbed thực sự nhận được nhị phân bằng cách sao chép chúng vào ổ flash sẵn có và sau đó được thiết lập lại. Nó hiển thị dưới dạng ổ flash khi được kết nối với cổng USB của máy tính. Nếu bạn có thể sử dụng một phương pháp để sử dụng ổ đĩa flash thay vì thẻ SD hoặc thiết lập nó để một tệp nhị phân từ thẻ SD được sao chép tự động vào ổ flash và thiết lập lại được thực hiện thì bạn có thể gặp may. Các mbed không yêu cầu một lập trình viên phần cứng.
A-mốt


3

Tôi nhớ đã đọc về một bộ tải khởi động cho các AVR sẽ flash lại chip bằng tệp .hex (có lẽ là) từ thẻ SD. Tôi không thể tìm thấy nguồn ban đầu, nhưng tìm kiếm Google này cho thấy một số lượt truy cập thú vị. Vâng, tôi biết đây là AVR chứ không phải PIC, nhưng bạn có thể thấy nó hữu ích nếu điều PIC không hoạt động.



3

Như các áp phích khác đã lưu ý, bạn không thể thực thi từ RAM trên PIC 8 hoặc 16 bit, vì chúng sử dụng kiến ​​trúc Harvard (không gian mã và dữ liệu riêng biệt). Việc có nên tải chương trình ra khỏi thẻ SD hay không và flash vào bộ nhớ mã tùy thuộc vào tần suất bạn sẽ làm việc này.

Nếu bạn đang cố gắng tạo môi trường động như một hệ điều hành liên tục chồng các chương trình, thì không. Nhưng trong trường hợp của tôi, tôi có một chương trình tải trình điều khiển khi cần bằng thẻ SD 2 GB. PIC24FJ256GB110 có chu kỳ xóa / ghi tối thiểu 10.000. Ngay cả khi điều này được thực hiện năm lần mỗi ngày, đèn flash sẽ tồn tại tối thiểu 5 năm rưỡi.

(Lưu ý: con số 10.000 là tối thiểu. Độ bền chu kỳ xóa / ghi thông thường có thể gấp năm lần - vì vậy nếu bạn đang phát triển, có thể bạn có thể flash lại bộ xử lý 140 lần một ngày - cứ sau 3 phút rưỡi trong tám giờ - và nó vẫn có thể kéo dài một năm.)


2

Ở trường tôi, chúng tôi đã sử dụng bộ xử lý HC11 hoặc HC12 với RAM ngoài để tải và thực thi các chương trình trên ... nhưng tôi quên tên của bảng / bộ :( Trong mọi trường hợp, MCU tuyến tính Freescale HC (S) giống hệt địa chỉ RAM và ROM , vì vậy bạn có thể tải mã vào RAM và thực thi nó.

Lấy hàng đợi từ blalor, giải pháp tốt nhất có thể là chỉ cần thêm một nút trên bảng của bạn có thể phản xạ PIC từ dữ liệu được lưu trữ trên thẻ SD mà bạn chèn bằng bộ tải khởi động. Tôi không thể tưởng tượng loại mã nào sẽ không phù hợp với các PIC lớn hơn; nếu bạn có một số dữ liệu tĩnh (đồ họa, văn bản, âm thanh), hãy giữ dữ liệu đó trên bộ nhớ ngoài.


1

Bạn có thể không thể phân bổ từ RAM, nhưng đối với ứng dụng của bạn, bạn có thể có một trình tải nhỏ trong flash, sau đó có thể đọc dữ liệu thẻ SD vào phần còn lại của flash. Tôi đã sử dụng phương pháp này với chip flash được điều khiển SPI để cho phép phần sụn được tải từ một liên kết không dây và sau đó được cài đặt khi nó được nhận hoàn toàn; Tôi có thể nghĩ rằng không có lý do cụ thể nào nó sẽ không hoạt động với thẻ SD, mặc dù bộ tải khởi động tương thích SD có thể chiếm một số dung lượng.


Tôi đã làm một cái gì đó tương tự cho một thiết bị có một số phần cứng và mục đích hơi khác nhau: Viết tất cả các tệp vào flash SPI bên ngoài (có kích thước lớn hơn nhiều so với hầu hết các bộ vi điều khiển) và phản chiếu bộ điều khiển bằng một trong các hình ảnh với bộ nạp khởi động nếu một nút được giữ trong khi đặt lại.
Kevin Vermeer

0

Khá nhiều bộ vi điều khiển sẽ cho phép bạn làm điều này, nghe có vẻ không phải là pic. Những gì bạn muốn làm là có một bộ tải khởi động sử dụng spi để đọc từ thẻ sd, sao chép chương trình, có thể muốn là một tên tệp được biết hoặc mã hóa cứng, có thể trong thư mục gốc, phân tích tệp đó thành ram rồi phân nhánh chương trình trong ram. Các bộ điều khiển dựa trên ARM chắc chắn sẽ cho phép bạn làm một cái gì đó như thế này.

Một cách khác là để bộ nạp khởi động đọc thẻ sd qua spi và thay vì sao chép vào ram và ghi nhánh vào một phần của đèn flash. Có lẽ muốn có một nút nếu nhấn nút bật nguồn hoặc đặt lại sau đó tải chương trình mới từ thẻ sd, nếu không, nếu chữ ký hoặc tổng kiểm tra có vẻ tốt trên phần flash có thể tải đó thì trên nhánh khởi động vào phần flash đó. Hoặc có lẽ nếu thẻ sd có mặt thì tải từ nhánh khác sang phần có thể tải của flash. Có thể sử dụng phương pháp này với dựa trên cánh tay và dựa trên avr, thậm chí có thể dựa trên pic nhưng kinh nghiệm pic của tôi là ngày. msp430 tôi cũng sẽ giả sử như vậy. Về cơ bản nếu bạn có thể lập trình lại các phần của đèn flash bạn thực hiện từ chính bộ xử lý vi điều khiển,


Hmmm, thực sự tôi đã không lập trình một avr từ avr, xin lỗi đó là quá nối tiếp từ một máy chủ lưu trữ. Đưa ra một giải pháp thứ ba mà bạn thấy rất nhiều bảng sở thích giá rẻ đang làm ... sử dụng hai bộ vi điều khiển. Trong trường hợp này, người ta sẽ giữ cái kia trong thiết lập lại, đọc thẻ sd, lập trình cho micro khác, thông qua nối tiếp hoặc khác, sau đó phát hành thiết lập lại trên micro khác. Các bảng sở thích / eval thường có một micro cho giao diện usb và nó thường chuyển sang các bảng khác.
old_timer
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.