嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ) p5 c) j( s: Q6 U* N

# [3 e5 s/ n) j3 C. UOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
6 c$ Q  b. p, g: v% ?#include <unistd.h>% c8 c' A% K" h5 M7 s2 ]- W7 Z
#include <sys/mman.h>4 ]  j9 h$ n0 u3 B1 \
#include <sys/types.h>0 k; d2 B1 f6 q, `# }
#include <fcntl.h>
/ r% m2 U# V( ~1 {3 v& F
4 P2 N6 q7 L8 J4 F( {0 Q2 P#define SHAER_RAM_BASE_ADDR    (0x80000000)   , z1 T6 o7 c: \9 ]6 N4 b- g

. K) D# Q' Q- B8 utypedef struct
4 {* V8 ~' _6 k* F* B, W# H{
4 a2 O3 ?/ T2 f$ d, S( V+ N8 d4 m        unsigned int a;
$ m7 U# p. x  I' {* i4 m        unsigned int b;
. {8 E( `" X( ]        unsigned int packet_cout;# i! I" }: R, ~" i$ F7 Z
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;: E4 g* E, r" J( S' g( I+ V8 T9 e0 b

* A) p/ T* I8 u+ W/ Avoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);. b4 E) Z! ]0 {3 `0 v7 Z  m% E
unsigned int count_copy = 0;$ U9 G1 h  U+ q6 K
+ @2 `2 Q+ M: q% \6 a- U$ `5 }) ]

% o/ F4 r& K1 J; H, |0 {) u  _8 Q5 Gint main()
& A4 ?0 n3 Y$ c" `9 E{; X" k& s7 r  d8 a
        pRX_MSG_PROTOCOL pshreRAM = NULL;
: s  n: c9 f& [" c        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;) O7 B: ?- G& w1 |/ h
: u* g' ]9 L/ u" q
        while(1)* o5 d& H. y6 V. [% {3 v* I# W
        {
: v7 x& a1 H0 N# ^6 N9 ?) r# J1 j                read_MSG_buffer(pshreRAM);
; p: O5 W6 M) q$ w6 A9 `        }               
% k) H& O- M8 e6 v4 E) H}
2 |) {3 i. v1 g& n
9 S/ C: t! K3 Q8 `9 ^$ Qvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
; `/ Y8 w9 k3 p! ]; |9 U# p. ?; p{
: d4 K7 P) E6 j: M( {        RX_MSG_PROTOCOL buf;1 B9 n4 S& s5 o
          B4 c5 u- o1 ?6 q; c- j
        buf.a = pshreRAM->a;8 G+ S/ x3 j7 `; Z' C
        buf.b = pshreRAM->b;
2 j+ k, E9 t; C  R0 T        buf.packet_cout = pshreRAM->packet_cout;# M; \( Y! n8 p, _
        
6 W* P$ N; Z: s0 ~" a        if(buf.packet_cout != count_copy)
; W- T: q9 [; ?        {
; G9 K9 \! J4 L; c8 U6 |                printf("a is %d\n", buf.a);0 w$ D( l* G" G0 e( t: H
                printf("b is %d\n", buf.b);2 a* J1 s" @5 d8 @5 `
                printf("count is %d\n", buf.packet_cout);
% S( |; r6 Y4 m% v4 `% t                count_copy = buf.packet_cout;* N1 W& T; d5 N6 Q0 G1 ^' k+ m
        }
; s+ ~3 r( [2 o! C' J        else
* u- t6 [. \1 @( [, o, g        {* e6 R0 G6 m0 i0 p2 W  D
                printf("No effective message!");# H+ l; E2 g; a9 k8 X! H- Q
        }
1 @' v8 G/ z9 ~6 `3 [, D1 Y8 H}
  t2 ~8 A) x1 @4 R1 v% h% ?' j, t' j8 v3 G  x
4 A" I, U3 W8 _
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。0 H& {. L4 I1 p' N
使用下面代码,对内存使用了mmap函数后:( Q1 b4 [& w1 R+ g# r, ~
#include <stdio.h>
  f  z% d1 ?: K  e#include <unistd.h>
$ z7 N- e* i) s( T#include <sys/mman.h>
) {4 O0 W& S4 \& ~( P$ M5 j#include <sys/types.h>
* ]; o* p' f, ]8 d#include <fcntl.h>7 Z- m0 M& F( v! b
5 O6 k* V$ v7 h
#define SHAER_RAM_BASE_ADDR    (0x80000000)9 G7 `: c) Y; i9 d2 S7 a; W: f
#define SHAER_RAM_SIZE         (0x20000)   * Q" J. q5 A6 g* D

0 O9 H7 u( a% p. y/ n# otypedef struct
) v1 c8 u6 H) l# [{
/ V8 ]$ J6 l6 I; t        unsigned int a;$ k6 K; x+ L/ O0 S# O+ S- v# b
        unsigned int b;* M6 W7 J- Q$ S  T& A
        unsigned int packet_cout;% v* q! i; n& u  i, E& P& u! s
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;7 _* r: e$ T2 R( V+ J

+ B, H  {: f4 h7 M- v* avoid read_MSG_buffer(int *baseaddr);
: X/ @4 o, z* n$ {5 W: Punsigned int count_copy = 0;
1 k- f. F! M5 F* T/ Z9 P( Z$ A) i1 s1 ~* B8 p, V" ]: W% r- X
int main(), @; o$ B2 `1 T1 U1 X5 \
{
( h  ^( v" J0 H9 @' w) {        int fd;
: d* m5 Q) J; u" Q        int *mem = NULL;, f& {: R/ Z7 P4 {" M4 J' ~

) t% f* ^8 X- {; x+ _& L        if((fd = open("/dev/mem", O_RDWR)) <0)4 Z& O. i) o) R$ Z# W( i
        {4 F% B& ?2 |) N+ x/ s9 F
                perror("open error");
* S4 D+ b9 X' }: Q0 h                return -1;! R5 V/ z- b1 J0 Q
        }" k+ }0 z9 }* [3 s1 y
        8 y0 p( y" i5 G# o
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);- Q2 V9 b! s0 t+ }1 Z$ m
  [0 ]: v3 ~: y. i
        while(1)
0 I% [# m& Q# A        {
8 Q8 V1 I6 h4 ~* G4 ?4 m                read_MSG_buffer(mem);' @8 d, A+ b8 j' z4 \
        }               
3 f' r/ K3 d5 [! |8 e}
' P7 J8 c7 w9 J) d5 b1 W9 H7 R' {& G( |6 Z& Y; S
void read_MSG_buffer(int *baseaddr)
) H+ h& y1 ~$ H; g  `# |2 k" e( R2 I{$ j- i1 @& g% X. H4 O, Y+ Q
        pRX_MSG_PROTOCOL pshreRAM = NULL;0 \$ I7 O- a- g9 R2 Q

  I! X0 q/ K# e        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
/ i- y* X9 X. V" @  E, x5 F) S/ W2 X/ ~1 B) W! Y
        if(pshreRAM->packet_cout != count_copy): i$ i# R$ {2 Y) w. j8 ^0 R
        {
. S% ^) |4 B& \5 ]6 ?1 g                printf("a is %d\n", pshreRAM->a);
2 n3 p2 s! l) [" A                printf("b is %d\n", pshreRAM->b);9 c" ~$ B/ a5 P" s% m' B, \
                printf("count is %d\n", pshreRAM->packet_cout);
! o+ p/ F  j! H3 a4 s8 G                count_copy = pshreRAM->packet_cout;/ E& H2 Q9 a$ x# Y
        }
* \: ?9 _: ^% N+ r) f$ K7 e        else2 `: Z) w' Q: G6 u1 L  T
        {
6 m! Q3 V% K  [) }! ~+ `3 s                printf("No effective message!\n");
6 y. v! l/ @' |6 I/ }( t1 U$ a        }! N* y0 K! P8 l# p" P+ h
}6 K7 X: S( I' y6 ^6 P; Z' z$ G
1 o( n6 O. N: d; _: H& b
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
% O5 a* e" g( |  T
% j# y$ T/ K; j  ?" c; ^8 g# t6 h9 W

$ z9 }% O5 X$ W* G7 F4 M# Q
' ?: ~& j1 H; |: k/ y




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