嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
# \- m6 v/ X$ M7 l; y5 W5 X* V4 V2 q+ s/ F0 G7 H7 {) y
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>1 P$ m( l- ?/ A9 S0 J/ v3 Y# ]
#include <unistd.h>
  p6 Q. l6 `3 X/ Y$ I1 Z#include <sys/mman.h>
4 h7 O# p3 ]/ A#include <sys/types.h>5 s, Q. s: u- w
#include <fcntl.h>
* s+ R$ k9 P6 R+ k* ?9 q$ e* s% U+ X2 D! K8 {
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
' V6 C" |- O  z& d, l; k0 H3 P: q9 i+ D
typedef struct
0 Z  t: u, F6 f# J; D  Z{0 ]3 y* M% R% v6 u2 i% J9 R
        unsigned int a;
% _" A: F. C6 T3 `6 j1 R        unsigned int b;
  z2 x2 _4 C4 J: F, H) h/ ~% h        unsigned int packet_cout;  z; M# ]( \6 i( e8 X; I) `
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;! A! n$ ~: i: t
2 R& H! a% S/ ]. a, D
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
$ y. l8 Q  q9 \7 A& V* c& funsigned int count_copy = 0;1 `! A. m6 u( I& c" e. |

2 F5 H( Z" ?0 P3 D& G* ]3 X' x: s, n: v1 |' T5 G
int main()
# }0 w8 ?9 e0 ?7 u" ]. [{
  U# F4 D. k0 g6 t/ H        pRX_MSG_PROTOCOL pshreRAM = NULL;
' t1 ]! f9 b6 r3 R; L        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
8 t! B6 M3 l. q2 U- C4 N! |( a# M( h, \0 r* v' f
        while(1)# x1 z8 v5 O) C: l
        {! R" @  g+ D, v; W
                read_MSG_buffer(pshreRAM);
7 Q8 l; ~5 S9 a0 e4 R8 U' g        }                4 N  `* z( ~1 M$ i
}0 e) T# K0 o8 z9 B

9 i0 w( W, |0 ~, F4 r, o2 Jvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
, S5 ]% K* r1 C( ]{$ C7 h$ G" j, E3 s' |8 ^3 S
        RX_MSG_PROTOCOL buf;3 N# N! P: d$ A4 j" l
        
) |6 K3 M6 G% q9 n6 m        buf.a = pshreRAM->a;
: Z! R) e# p6 b        buf.b = pshreRAM->b;5 K3 ~9 R! v4 f* h2 s" [
        buf.packet_cout = pshreRAM->packet_cout;
" u: S& k! f- ^& g2 O' E        
. z- f9 |" l! n8 {% `# H        if(buf.packet_cout != count_copy)1 _% }3 E# U3 d8 t$ u' S+ o) Y6 \
        {% i$ @; O8 n3 {# n% l7 ]
                printf("a is %d\n", buf.a);& T# H5 ~8 v6 f5 V: g
                printf("b is %d\n", buf.b);
7 _8 o( C$ j) h) H  W' X# L8 v                printf("count is %d\n", buf.packet_cout);$ [3 Z) A% |4 K1 k* ?" N
                count_copy = buf.packet_cout;
& Z6 \5 c6 L5 c8 @& S. r( }        }9 D# `) t. o1 v* G
        else
! ^  z2 Q) [, j        {
- o( ~) W" P) S/ K! ~                printf("No effective message!");
8 l5 a+ g& F3 G7 i' u7 A( p. D        }9 U* W3 l0 `3 s# a2 q9 @
}
; ?& f# x7 q/ ^1 ?8 ~
0 I" T) |  ?+ e* C" [
6 E& y$ i  Z/ d& I但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
3 l9 f+ I- @6 Y2 S' N使用下面代码,对内存使用了mmap函数后:
$ h1 d& r2 s6 y% i( X#include <stdio.h>
% d# R- O! F. w7 q! Y#include <unistd.h>
8 g3 W9 |+ j! |4 S+ y% T#include <sys/mman.h>3 E" I3 ?/ Y) l) f9 X3 ^
#include <sys/types.h>3 F6 Q! Y( ]4 [6 t1 Z+ G, \& W
#include <fcntl.h>
8 P& e' o6 b* I% H
0 l/ J$ Y: N1 [#define SHAER_RAM_BASE_ADDR    (0x80000000)4 E6 [" c3 j# T  F' q
#define SHAER_RAM_SIZE         (0x20000)   ) E$ Q- z. Q2 }# q0 N
! t( l- D$ u3 k( R' I5 |/ q3 ^
typedef struct+ d- z- ]1 m* s5 Q3 b* O: k
{
) \# H( s5 G! }0 l9 ^        unsigned int a;
$ U7 Z' }5 W3 i+ [        unsigned int b;& Q/ |9 |4 _7 C! f
        unsigned int packet_cout;9 P+ p0 `7 v+ {5 a" Z3 K
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. e# W9 e" T. U2 b9 ^
' s& z" M9 p5 a+ V/ jvoid read_MSG_buffer(int *baseaddr);- w; C) @0 X, n1 q
unsigned int count_copy = 0;
8 G# [/ c- x& d- y9 m5 ?% A- H/ K# ]7 ^4 A5 c+ p( ?7 y
int main()  V' B, A# N& A" ]" ?$ P' C7 v
{# j- M1 ^( |1 [$ ]
        int fd;  g7 q, L# ]. _" }% c1 C( T9 ^$ @
        int *mem = NULL;
. x9 x' K7 `7 C( k3 q1 e! n9 O- B$ r3 \! {' q# A( s
        if((fd = open("/dev/mem", O_RDWR)) <0)) Q- |4 T- o; x* P6 W
        {
# O5 }+ [! g9 P- A                perror("open error");! _- L/ g  {6 `
                return -1;6 l2 B$ t  E+ u1 w/ I
        }
7 p. R" Y/ n, h# Z# Q        
. k) `. g, j' w% i# D( z, r, x        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);0 Y4 o8 Y1 a9 q* c

7 a; s" y8 o( c3 P1 W        while(1)$ v: K3 M* W; B# K, |6 U
        {1 O( Z+ N& B# d0 X- p, ~8 {
                read_MSG_buffer(mem);
6 ?. v* N1 I, P/ G1 ~  w* w; }( ~        }               
: w3 h- `' s2 e- W4 N2 E/ T2 H3 E' _5 F}
4 a* x2 n6 W! x4 V* g
5 u) h" I% A# ~& U  L/ P- }' Svoid read_MSG_buffer(int *baseaddr)
& Z9 P9 X3 k! k1 H9 T) P; w{) n2 U  s6 Y0 K7 z  E0 z7 z
        pRX_MSG_PROTOCOL pshreRAM = NULL;
( R# B7 b$ ]  D6 m& g$ S: b) W9 H
& C* l3 p" j; R        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
/ q7 x6 S0 R% O, |9 s% g$ L; {
$ z+ d* R# S# n; A! \        if(pshreRAM->packet_cout != count_copy)
- z% o5 ^* M+ ^6 e* ~) l        {+ X) Y. @) a- h
                printf("a is %d\n", pshreRAM->a);0 r' d: s0 l0 G3 j3 X
                printf("b is %d\n", pshreRAM->b);/ B5 d" K9 q! R
                printf("count is %d\n", pshreRAM->packet_cout);+ e/ {2 w& \+ x  {
                count_copy = pshreRAM->packet_cout;2 L! ~$ z- ~2 f; j# d& m5 C  q
        }
( T+ y0 z* T8 s# d        else
! Q7 l+ X2 i9 r. c        {9 _# y) p4 u; B- Q' ^0 @, x
                printf("No effective message!\n");2 L2 @3 m6 t2 L$ L, k# p6 `
        }4 |  S6 I4 I1 b; v% d9 \9 ^. K6 X
}( ^6 P8 k& r$ v# i

  l% f* \- O  ]' G没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???( m. l0 Q! `+ S1 p5 Q3 U9 o
& p( E  e# O% k6 @8 }# B' ~' }

' h6 O  V1 T- i3 W- _# L& D* C6 W" u/ r$ q5 o  Z7 b- K
1 r! T3 }$ z$ M' ~4 @





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