嵌入式开发者社区

标题: OMAPL138的内存映射是否在Linux下已经完成??? [打印本页]

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 0 }* G1 Z+ X7 b# b' N5 C
5 z. f$ g* R5 ?. I! n3 a
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>2 U" ~+ I6 H6 k  \7 h1 r0 g
#include <unistd.h>
5 H6 u, M# j$ y1 _+ t5 ]: q#include <sys/mman.h>2 X5 U/ x) O$ T5 z- b& z' y% t; P9 r
#include <sys/types.h>
3 }8 W6 k1 W0 r6 j2 G8 W#include <fcntl.h>
; Z$ F6 N3 w* J& v; f( K7 E3 e" S0 E' ]4 z4 v& f
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
6 }& ^! b- J" W# ~6 `' [1 b
' [! E' a3 R" j! @( |, E3 {typedef struct
4 o: @4 _8 s' c4 ]{. }$ \9 X8 y, W- l( y3 U/ y
        unsigned int a;- |8 Q- e& [9 \7 \4 B9 |. o
        unsigned int b;5 m' p7 j; b  U" d! ~
        unsigned int packet_cout;
+ _3 F5 d& H4 A  k( v/ f0 H}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 b7 [( }* R, s) Z3 j. |+ H0 d# @: Q4 q$ t+ q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
& a, M3 p" i; G6 `2 S# junsigned int count_copy = 0;% l% t5 B2 p1 R# N; W
8 l' a( v# F, E* q, K

; b9 A2 r7 ]" T! Jint main()4 ~/ Q. J; Z+ C; ~( O! F/ A9 R5 x
{( F0 v% ]  {, v0 |' @
        pRX_MSG_PROTOCOL pshreRAM = NULL;+ v+ a0 z, ~) J$ g9 y3 Q
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;# e1 ~- j# w% D" h
! g* L" y" p) ?# }" H6 h
        while(1)
; C+ n7 F3 m, k8 }( Q& T        {
4 q7 e  X; g6 c! |/ k' K' X                read_MSG_buffer(pshreRAM);% X: _, V0 o8 A8 f: ?7 Y& R$ s
        }                8 f0 `7 a) T- E5 O; k- b
}8 ]+ X3 A' n# O* F# o+ k

: q& X) ~; v, I; ~, [void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
8 T& e8 y" ?3 e+ E% h$ b{8 _6 o  A6 ?/ R% d) k# L# w" l9 P
        RX_MSG_PROTOCOL buf;7 ]! N: m1 t/ i2 D
        , r3 W4 K7 ~' r+ d/ g" u" _- R
        buf.a = pshreRAM->a;
' g8 c+ u! E8 V. b6 [        buf.b = pshreRAM->b;
# _6 a/ l4 w, d4 `) a# Q        buf.packet_cout = pshreRAM->packet_cout;
' h+ u7 s" _1 n7 K        
% |( t' g) D7 c5 {+ i# q        if(buf.packet_cout != count_copy)
% Y0 I' U$ O, t  p" e        {
4 q; q7 q* N6 F                printf("a is %d\n", buf.a);
9 i9 P5 F# z4 H                printf("b is %d\n", buf.b);
* h1 \: f) V) B, j8 _( ~                printf("count is %d\n", buf.packet_cout);
0 Z) N& q5 g7 v4 J0 s                count_copy = buf.packet_cout;
  V3 g) r% b* ^# ?        }7 U; c# u" m, i+ q
        else
5 Y$ T/ S  ^2 s  w2 |; K1 \2 r+ a        {, J" ?* \4 r7 P- `* u
                printf("No effective message!");
; g- u1 L+ d$ D        }
  U/ ~+ u, p: I, [5 G; p}7 b" a6 g1 e: a; z9 |

1 d3 V, G9 I! h3 B4 v
9 d9 w: c1 d% T! Y6 E+ x+ u# n但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
% P4 @: p% C. ?2 m# \8 e' N: P使用下面代码,对内存使用了mmap函数后:5 b! Q. _' j8 i# s
#include <stdio.h>7 P5 ~6 M, [0 M# x
#include <unistd.h>. I" U; E7 G( N# z
#include <sys/mman.h>
# }! ~/ z7 E- S1 s; j3 ^$ q#include <sys/types.h>5 g% E( n9 p' i1 D
#include <fcntl.h>+ L9 q8 @/ u3 ~3 u# h) f, }

7 D$ a7 \& x+ Y' O; ^#define SHAER_RAM_BASE_ADDR    (0x80000000)
1 v  ^- Q1 c  g4 F4 T#define SHAER_RAM_SIZE         (0x20000)   6 g6 @0 W4 [6 p  p1 y; U

1 F, ^# c) B; @! J! V& H, gtypedef struct) m5 E6 R7 J8 h7 {' o
{/ f+ h/ g, V7 a# L: \) A) |
        unsigned int a;
4 t( e) M) v% u- }9 x- Y        unsigned int b;
1 H6 H& \+ }) F6 ]# c        unsigned int packet_cout;
# m# X+ w9 x+ g8 I1 B}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;- {  @0 a" Y, b) D9 ~; p0 w

" R' d1 \! J# H- F, u" g" lvoid read_MSG_buffer(int *baseaddr);
" }' ?* L7 N( @8 uunsigned int count_copy = 0;
- m$ P# y) }/ V- h6 O9 g' ~$ e1 }
+ e. N3 \( }' b5 a7 G! t! _8 Kint main()  T, E) `! I0 T. X" ^& Z; [" y
{
4 `, p; R5 a+ B! w# E        int fd;  [+ K) {/ [3 \2 H
        int *mem = NULL;2 Q# z# X+ H! M

  [2 b" l9 G3 j4 V6 A, A        if((fd = open("/dev/mem", O_RDWR)) <0). a( t- d9 d/ ~$ v
        {$ F; B( f+ k3 e
                perror("open error");  O- x/ c0 H, z! `0 ?% ]3 I
                return -1;
& z/ _! q4 a. o$ b; O, B% g        }
$ h6 T! S, }3 Q4 Y5 M; Q- S        7 d  r3 V5 y$ ]* x" Z) o9 S  o
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
- O' y( R* u1 F" j3 i
/ h. R. P2 u  w4 [        while(1)) J0 d+ n( u- l# O! h6 U! U
        {
& Q. Q/ d9 i& o) N) B9 [8 n                read_MSG_buffer(mem);
- S6 n5 W: j! f' \! P" H0 C4 ]        }               
1 y( ^7 J! f' [}
( H, }2 R! C1 n# A$ U2 ?1 \. ?) \( S# G5 c# U; j9 ]
void read_MSG_buffer(int *baseaddr)
  Z4 S; v+ g9 O$ M; S/ @{- B. ^, r/ q  I, W0 y2 @8 Q
        pRX_MSG_PROTOCOL pshreRAM = NULL;' ^  e8 h8 E- W# D/ Z* F6 n

1 z7 \; [3 Z6 z4 C. S+ n5 v        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;8 x2 S; @: s% z9 b0 A8 K4 i
/ B0 D+ h' e& p4 r- n; z6 g: D
        if(pshreRAM->packet_cout != count_copy)4 N" X* f2 ^* `* G( y
        {
8 h( {: z: u3 G1 T* |* s, z                printf("a is %d\n", pshreRAM->a);5 }) e+ g/ T# g$ [& B
                printf("b is %d\n", pshreRAM->b);
. P; _2 L. B3 I! A                printf("count is %d\n", pshreRAM->packet_cout);
% Y# \0 f! d. p                count_copy = pshreRAM->packet_cout;
; C$ [: r+ y6 y: [5 t$ B        }
( e- n, Z! q5 \: [& G        else* J& ~, |) F: A# K
        {7 N* C6 J, D: ~1 F6 F8 F, b
                printf("No effective message!\n");
2 b) x& B: y+ h' M0 x+ Y        }. \, }# S5 ^- X# S4 O
}
! E3 n9 `3 N2 ^/ A
6 }3 H% H6 e& y7 N没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???* T; @& w9 o/ C
1 S' T5 o; O  @2 b) y( t

: q% p: a: p9 A5 w+ O, p( ?
  y( B+ F& M; d. G& Q- T
, ]/ \6 v! u% W  g& f: m




欢迎光临 嵌入式开发者社区 (https://51ele.net/) Powered by Discuz! X3.4