80c196kc và con trỏ stack

K

kasd

Guest
Bất cứ ai có kinh nghiệm với 80c196kc intel và con trỏ ngăn xếp của nó?

Tôi có vấn đề khai báo con trỏ ngăn xếp của tôi đến địa chỉ bộ nhớ bên ngoài mặc dù Datasheet nói rằng ngăn xếp có thể được đặt trong hoặc bên ngoài nội bộ ....Tôi đã nối dữ liệu MCU và địa chỉ đường dây đến một máy phân tích logic và thấy rằng MCU đi sai địa chỉ sau khi thực hiện một trừ đi 2 khỏi đống con trỏ nếu con trỏ cư trú trong bộ nhớ bên ngoài.

PS: Tôi đang sử dụng trình biên dịch IAR cho thế hệ nhị phân.

 
Tôi không có vấn đề với bên ngoài stack với 196KC, tuy nhiên tôi không nhớ trừ đi từ con trỏ ngăn xếp.

Nhưng, như các con trỏ stack chính nó là một SFR (ở cùng địa chỉ và hwindow cả đọc và viết), nên có cái gì khác.Nếu bạn đang làm việc trong C và rối tung xung quanh với đống, tôi nghĩ rằng bạn đang làm một việc kinh doanh rủi ro; các trình biên dịch không mong đợi người sử dụng để làm bất cứ điều gì với chồng.Tại sao các bạn cố gắng để làm điều đó?

Làm thế nào để bạn biết chính xác làm việc "trừ đi 2 khỏi đống con trỏ"?Bạn có thể đăng các danh sách biên soạn (có lắp ráp) của các phần có liên quan?

wek

 
Tôi không làm gì để ngăn xếp.Nó xảy ra khi chức năng chính là nhập như bạn có thể thấy dưới đây.Tôi không hiểu tại sao các trình biên dịch IAR sản xuất lắp ráp này để trừ đi các SP quá ...

Nhưng dù sao nếu tôi điểm SP để RAM nội bộ tại địa chỉ 0x200 và dưới đây, nó hoạt động tuy nhiên, ngay cả với điều đó trừ đi ngày nhập chính.

Mã số:1 # bao gồm <IO196_KC.H>\ Trong phân khúc NEAR_AC, lúc 0xf

\ Unsigned char dễ bay hơi __near __IO_PORT1;

\ __IO_PORT1:

\ 000.000 DSB 1\ Trong phân khúc NEAR_AC, lúc 0x10

\ Unsigned char dễ bay hơi __near __IO_PORT2;

\ __IO_PORT2:

\ 000.000 DSB 1

2 /************************************************ ************************************************** ********

3 * hằng số

4 ************************************************* ************************************************** *******/

5

6 /************************************************ ************************************************** ********

7 * biến

8 ************************************************* ************************************************** *******/

9

10 /************************************************ ************************************************** ********

11 * CHỨC NĂNG nguyên mẫu

12 ************************************************* ************************************************** *******/

13

14

15 /************************************************ ************************************************** ********

16 * CHÍNH

17 ************************************************* ************************************************** *******/

18\ Trong đoạn CODE, align 2

19 void main (void)

\ Chính:

\ 000.000 yêu cầu? CL96KCSF_6_02_L08

20 (

\ 000000 69020018 SUB SP, # 2

21 volatile unsigned char x;

22 __IO_PORT1 = 0xFF;

\ 000.004 B1FF .. LDB GR 0:8,? # 255

\ 000.007 C7000F .. STB GR 0:8?, 15:08 [0]

23 __IO_PORT2 = 0xFF;

\ 00000B C70010 .. STB? GR 0:8, 16:08 [0]

24 / * __IO_PORT2 = 0x00; * /

25

26 cho (;;)
 
Ah tôi thấy.Nó là lạ; tuy nhiên tôi không C trên 196KC.

Nơi nào bạn cố gắng để thiết lập các SP tại?sắp xếp bộ nhớ bên ngoài của bạn là gì?Và làm thế nào để bạn biết được "MCU đi sai địa chỉ" và có địa chỉ là nó?

wek

 
Tôi thiết lập các SP trong file khởi động lắp ráp được cung cấp bởi trình biên dịch / lắp ráp.

Dưới đây thực hiện lắp ráp tại địa chỉ 0x2080 và # SFE (CSTACK) có một giá trị mà tôi đã chỉ định trong cấu hình một.Tại sao nó quá phức tạp.Vâng, trình biên dịch / lắp ráp thủ tục mặc định.

Giá trị của # SFE (CSTACK) có thể được xác định bởi 0x0180 mà làm việc đúng hay 0x1700 mà không hoạt động đúng.

Mã số:RSEG CSTARTkhởi động:

LD SP, # SFE (CSTACK); Từ cao đến các địa chỉ thấp
 
Nếu ngăn xếp được đặt ở 0.100-01FF, là bạn có thể ghi vào RAM tại 1600-16FF viết và đọc lại các từ?(Nói cách khác, là phần cứng của bạn bên ngoài bộ nhớ OK?)

wek

 
Tôi nghĩ rằng bộ nhớ RAM là ok bởi vì khi các SP được trỏ đến địa chỉ bên ngoài tại 0x1700, MCU là có thể lấy từ vị trí đó bên ngoài.Tôi đã kiểm tra điều này với các phân tích logic.

Nhưng sau khi MCU làm việc lấy @ địa chỉ 0x1700 cho trừ, MCU đi cọng cỏ bởi lấy dữ liệu từ địa chỉ 0x0000 và sau đó tăng dần.

Có lẽ tôi nên thử một trình biên dịch.

 
Nonono!Nó không nên lấy từ 0x1700 cho phụ sp, # 2!Nó có thể tìm con trỏ ngăn xếp tại địa chỉ 0x18 (đó là một SFR), không phải là NỘI DUNG của stack!

Những gì tôi nghĩ rằng đang xảy ra là, rằng sau khi bạn thiết lập các SP để 0x1700 một ret được thực hiện; mà fetches một số rác thải (nhất có lẽ là 0x0000), sau đó đặt vào máy tính và tiếp tục chạy từ đó ...

Có lẽ bạn đặt SP-thiết lập vào một địa điểm không chính xác.

Bạn có lẽ nên cố gắng bước qua hex tạo / nhị phân trong mô phỏng một số?

wek

PS.Tôi hy vọng bạn nhận thức được rằng việc đưa vào bộ nhớ stack bên ngoài làm giảm đáng kể hiệu suất của 196KC, đặc biệt là nếu stack là trong một-bit RAM 8.

 
hi wek,

cảm ơn cho bài trả lời của bạn cho đến nay.

sau khi tôi đọc thư trả lời của bạn, tôi nhận ra tôi đã thực hiện một mô tả sai trái của chương trình thực hiện.đây là những gì đang xảy ra sau khi tái lloking tại LA chụp.

các sự kiện thực tế bị bắt:
sau khi lấy chỉ lệnh đầu tiên của chức năng chính là SP SUB, # 2.các MCU lấy từ 0x14FE vị trí và nhận được 0x0000.Sau đó bắt đầu MCU để lấy dữ liệu từ 0x0000 trở đi.Tôi không hiểu về việc từ 0x14FE vị trí bởi vì trong SP tôi đã viết 0x1700 như hình dưới đây.0x14FE chỉ là quá xa.

Máy địa điểm hội
0x2080 A1001718 LD SP, # 1700H

 
Cũng có thể có cái gì khác giữa SP LS, # 1700h và SUB SP, # 2, mà thay đổi SP chính nó.Tôi không thể nói cho nó mà không biết các chi tiết, do đó bạn cần có lẽ đi qua toàn bộ hướng dẫn LA-hướng dẫn-by và giải mã những gì xảy ra ...

wek

 

Welcome to EDABoard.com

Sponsor

Back
Top