Cách khởi động lõi 1,2,3 trong Raspberry Pi 2


10

Tôi đã viết một ví dụ đa lõi kim loại trần.

Mã, sơ đồ mạch ở đây - https://github.com/jeffreyantony/multipi/tree/master/Example_01

Trong ví dụ của tôi, có 3 đèn LED được kết nối với các chân GPIO của mâm xôi Pi. Có tất cả 4 lõi trong Raspberry Pi 2. Mỗi lõi được chỉ định để nhấp nháy đèn LED tương ứng.

Tôi đã viết địa chỉ của mã được thực thi bởi mỗi lõi trong các địa chỉ dưới đây 0x4000009C cho lõi 1 0x400000AC cho lõi 2 0x400000BC cho lõi 3

Sau khi biên dịch mã, chỉ đèn LED được gán cho lõi 1 đang nhấp nháy (theo ví dụ này là đèn LED màu vàng). Những người khác thì không.

Điều này có nghĩa là mã cho Core 2 và 3 không chạy (vì các đèn LED khác không nhấp nháy). Ngoài ra, tôi thấy rằng mã sau khi bắt đầu tất cả các lõi cũng không chạy, ví dụ core0_submain () - chức năng này sẽ nhấp nháy đèn LED ACT trên Raspberry Pi

Bất cứ ai có thể cho tôi biết vấn đề là gì? Có phải vì tất cả 4 lõi đều cố gắng ghi vào cùng một thanh ghi GPIO và chỉ Core 1 là chiến thắng trong phần ghi?

Tôi đã thử thêm " thuộc tính ((trần trụi));" cho core0_submain () nhưng không sử dụng.

Tôi đang sử dụng toolchain từ https://launchpad.net/gcc-arm-embedded

mã một lần nữa - https://github.com/jeffreyantony/multipi/blob/master/Example_01/main.c

makefile - https://github.com/jeffreyantony/multipi/blob/master/Example_01/Makefile

Cập nhật ngày 20 tháng 10 năm 2015 : Tôi đã thêm hỗ trợ cho JTAG. Nhưng không thành công để có được giao diện gỡ lỗi
Cập nhật ngày 25 tháng 10 năm 2015 : Sự cố đã được khắc phục. Xem câu trả lời.

Sơ đồ mạch nhập mô tả hình ảnh ở đây


Điều này có vẻ thực sự mát mẻ. Tôi sẽ xem xét nó. Ý tôi là, có thể có một số phần mềm trong raspbian chỉ sử dụng 1 lõi trừ khi những phần mềm khác là cần thiết để tiết kiệm năng lượng hoặc một cái gì đó ...
Kachamenus

Câu trả lời:


6

Cập nhật ngày 25 tháng 10 năm 2015:

Diễn đàn Raspberry Pi đã đưa ra câu trả lời cho tôi .

  1. Không có khái niệm về khởi động khi sử dụng -nostdlib

  2. mã được thực thi đầu tiên phải là tệp đầu tiên được chuyển đến trình liên kết.

  3. Nếu cần kiểm soát tốt hơn, mã cần được đặt trong phần init và yêu cầu trình liên kết sao chép phần này vào 0x8000

Cảm ơn tất cả sự hỗ trợ. Đã học rất nhiều về Trình biên dịch GNU C.

Cập nhật ngày 24 tháng 10 năm 2015:

Khi tôi thay đổi thứ tự các tệp được cung cấp để biên dịch trong Makefile, tôi đã nhận được thứ tự chính xác (nghĩa là tại 0x8000chúng tôi có _startchức năng) với -O2tối ưu hóa. Nhưng câu hỏi stackoverflow dưới đây của tôi về _startbiểu tượng vẫn chưa được giải quyết. Mã mới được kiểm tra.

Tôi đã có một số thành công. Mã mới được kiểm tra vào github .

Ví dụ này không hoàn toàn chạy. Có một số vấn đề với việc biên dịch. Tôi sẽ giải thích từng:

  1. Trên thực tế tôi đã mong đợi rằng _startbiểu tượng từ bắt đầu tùy chỉnh của tôi. Sẽ được thực hiện. Nhưng nó không phải là trường hợp. Do đó, con trỏ ngăn xếp không được cấu hình và việc chuyển sang chính không xảy ra.

Tôi đã hỏi một câu hỏi về điều này. Nhưng tôi đã không tiến bộ nhiều. Vì vậy, tôi đã thêm một hội đồng nội tuyến để tải con trỏ ngăn xếp trong chức năng chính.

  1. Nhưng mã vẫn không chạy. Khi tôi kiểm tra danh sách lắp ráp, tôi thấy rằng tại địa chỉ 0x8000(nơi bắt đầu thực thi) của Raspberry Pi là mã cho Core 1 - void core1_main(void). Giả định của tôi là ở 0x8000đó sẽ có _start(không phải vì tệp start.S không được lấy để biên dịch) hoặc ít nhất là hàm void main (void). Điều này xảy ra vì sự -O2tối ưu hóa của GCC. Trong GCC, với các mức tối ưu hóa cao hơn, các chức năng được sắp xếp lại .. Khi tôi tắt tối ưu hóa ( -O0), sau đó tại địa chỉ 0x8000, chính đã có mặt.

Bạn có thể đọc về sắp xếp lại chức năng ở đây

Tóm tắt: Mã hiện tại chỉ là một sửa chữa. Vấn đề chính cần giải quyết - Tại sao _start không được gọi từ start.S? Nếu điều này là cố định, tại địa chỉ 0x8000 _startsẽ đến. Với điều này, chúng tôi không phải quan tâm đến thứ tự chức năng được thực hiện bởi GCC trong quá trình tối ưu hóa cao hơn.

Ngoài ra còn có một video demo từ phía tôi như một bằng chứng. Mặc dù tốc độ nhấp nháy của đèn LED là khác nhau và định kỳ trong mã, vì tất cả các lõi cố gắng ghi vào cùng một thanh ghi GPIO, có một số xung đột làm cho đèn LED nhấp nháy theo các khoảng thời gian ngẫu nhiên.


Hãy thử và xem mã nguồn htop về cách họ làm điều đó để hiển thị dữ liệu đa lõi ra màn hình.
Piotr Kula

3
@ppumkin Điều đó thật vô nghĩa. htoplà một công cụ người dùng dựa trên * nix. Trên linux, nó chỉ lấy thông tin từ kernel thông qua /proc. Đây là thứ kim loại trần. Không có bất kỳ kernel nào để truy vấn.
goldilocks
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.