嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 # f- e' n; V. A
) v* |: [: X  O
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>6 }3 K& P) G1 r" D' r* o4 P
#include <unistd.h>
7 J0 ^( y3 ^1 O1 n1 t#include <sys/mman.h>, i; v. T( P. o2 ^; p
#include <sys/types.h>
3 q' W8 W' M  R# D% g6 O4 B#include <fcntl.h>
% {- H/ M0 x$ x  [$ j8 ~( L9 t) L0 B' j7 U; S
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
" G) [) P. @8 _+ ]7 B8 R* G* v! J5 Q! j( P; d  _5 g
typedef struct
. c( L2 ]7 K, q( w$ `% L{& i7 K1 Q$ p+ |0 t8 d
        unsigned int a;
, T/ K  O$ y3 i        unsigned int b;; g6 I/ a, v3 j! O, U5 }
        unsigned int packet_cout;
* g4 r4 z6 z- D}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;9 X5 j, }6 y( o$ r
; i; _& _3 w! O3 v. j% G* k  |. w
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);" |4 V, q) H7 s% l  a
unsigned int count_copy = 0;" y1 w; ]- r% F
7 {0 ^2 }2 n  R
4 z/ G$ |7 G1 g: u' N# u
int main()
  m/ |. l, K+ N! J{
, ^: W; e" [& @9 G2 H0 A: v4 y        pRX_MSG_PROTOCOL pshreRAM = NULL;
" U) f  t- n2 l. J* w2 Y$ _; f        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
9 _, y8 j  s& Z- v/ F" w# E+ m, ?
- b9 P- r! S& F1 p        while(1)
- |- ^0 e0 [- I" W$ ~4 A        {9 ]2 c4 u5 H* {% E
                read_MSG_buffer(pshreRAM);( O" c) E) K9 s( L$ }1 r
        }                ) c) i+ a  y9 c( }
}) P" M+ Y% N- a2 l  J- l8 C3 w
/ S9 R! K1 l) p  ?( n
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
4 s: _7 p' u- r/ C( @* b# m{
0 b- S% L8 v1 {; z3 z  i        RX_MSG_PROTOCOL buf;( C; z1 O  l1 b# H2 d/ E
        2 p* j& d* e8 x  J1 P2 [$ I4 |; \
        buf.a = pshreRAM->a;
6 D1 P  m6 f$ V3 R* e2 X; m8 n        buf.b = pshreRAM->b;; H/ m. k" t4 }7 u
        buf.packet_cout = pshreRAM->packet_cout;9 a4 L! d5 L: _4 s. z- ~
        ) b' l; {# a& ?: N; M5 r
        if(buf.packet_cout != count_copy)8 C# T9 u: K2 ?8 m
        {
! n8 X* T8 O4 ]- Q; j' ^                printf("a is %d\n", buf.a);! M& a/ ?7 c+ i! |$ |/ N( H
                printf("b is %d\n", buf.b);
; o1 s3 [% v" }$ A1 b                printf("count is %d\n", buf.packet_cout);
- z: G( i( a+ b& `                count_copy = buf.packet_cout;8 e& d6 `4 d" j) y" C5 c
        }. w2 a. a/ Z) V: M2 a) m- E7 i
        else
4 f, a! R' ~6 [- J" y" I1 B  u9 c5 ]        {. _# V' T* c0 N- G1 g* F2 I" |
                printf("No effective message!");+ y5 w$ t! o0 J) S0 _, N
        }, E6 J2 S7 d" H( p8 {* }3 G
}
( C( [) N! s! g: |6 W6 X9 L( k+ b. o  P% F) n& D7 {8 Q. W% U

) K0 u' o2 x9 p( a但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。! x2 r8 H3 }' q5 h+ z9 {4 a
使用下面代码,对内存使用了mmap函数后:& b' M4 Z: S8 L% A4 p
#include <stdio.h>, z$ Z4 x) u) g' U8 D0 J; @
#include <unistd.h>
3 ~- I9 Q  I! O' e- o0 l- {9 [' Y#include <sys/mman.h>
" C) _' R( ?. I; J  R( ~" @#include <sys/types.h>
! M/ }$ r, r- V#include <fcntl.h>/ N% M; w0 v1 h2 Y+ K7 V' w0 R
# h  a3 F" h" B
#define SHAER_RAM_BASE_ADDR    (0x80000000)) X- f4 z9 n; q% s  L) u; {
#define SHAER_RAM_SIZE         (0x20000)   
+ s9 K& C  h7 S+ f1 q0 o7 _+ `
/ E2 I( f/ S* Z" K1 O* a" P' }# [typedef struct
% y# v/ b1 n5 O2 k) {: r9 ]{( D. X7 C" W$ w. M8 A9 ~" W" B8 D. |
        unsigned int a;
* R6 N  ^0 N- [/ Y( L        unsigned int b;
& c% C' _, R. }2 ~& y9 Q        unsigned int packet_cout;
7 q+ x  Q8 H( V1 J  d1 p! r! @}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;" I6 M: V6 k, I4 q
  X) \. Q% r% H( v1 _8 L
void read_MSG_buffer(int *baseaddr);/ z* A. D; |. [
unsigned int count_copy = 0;1 D9 t: m1 |- X$ O/ p6 s+ a
/ T6 \8 U0 m/ u% y5 i) d
int main()
. t' D" N% O- k2 g8 @, h: \: D! g% J{5 u. U! ]3 z4 ]# o9 G- P) @' j* V
        int fd;
3 d- J( }+ K* l        int *mem = NULL;
% Q/ n) S4 ~+ J# P) B$ K) }
, i4 M4 U: d8 s; S. {4 f( s; i: P        if((fd = open("/dev/mem", O_RDWR)) <0)
1 w; c; L+ F5 y) c- x3 H        {' R9 O1 W! v# O, |; l6 ^3 |/ N
                perror("open error");6 I" X* R/ r8 K6 J0 }6 I9 z+ |
                return -1;
  t& e0 p" \0 m        }
5 ~. F, m1 D$ E4 A        
0 _7 @. p0 C4 T        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
, U( T# \% x# a/ ]( V$ {5 n* Y4 ~: M2 Z# L7 }9 j/ P
        while(1)
/ t' x* s3 B, h. A, w. {0 p        {- L2 K9 k' K/ M$ k
                read_MSG_buffer(mem);
# h8 k  h0 |) u% V6 B+ J! C: `1 D        }                  I0 S7 u. t# Z- r
}
4 `- P" e8 q/ D$ N6 m9 d: y# d; i: z  h3 D2 I1 h" W
void read_MSG_buffer(int *baseaddr)
4 s3 r5 [2 V0 H! X) ~  ~8 P2 [{3 w5 K9 f. W2 U8 M8 n
        pRX_MSG_PROTOCOL pshreRAM = NULL;
& h6 `; }: O  B0 s0 V8 f% ~: |# j2 ?$ R
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;1 m* ?5 n8 U1 d' J$ g5 q1 h

+ X! W6 p; ^$ z' d" J: u6 n        if(pshreRAM->packet_cout != count_copy), u( X( q2 F. L( H) P$ J
        {
' P. Q% f4 U5 x6 N                printf("a is %d\n", pshreRAM->a);
# T: u' k- T! }, O2 Z6 l2 y! K                printf("b is %d\n", pshreRAM->b);: F( K' B. [! Y8 [4 @8 c; S
                printf("count is %d\n", pshreRAM->packet_cout);
& Y0 @  t# B! L) k0 B                count_copy = pshreRAM->packet_cout;' d. K1 S5 O- |( v" t4 v
        }
$ P' W2 A% [0 K- \        else
5 H: j4 R3 w- C5 n6 I- b        {& F! F8 c/ _& L" p0 C
                printf("No effective message!\n");
4 \. v: X4 x# d8 \% |        }
- t# G. M2 B9 @: d# p}: a& X8 w8 `6 ~" @0 P

; `' D2 L% \3 d4 Q4 S- @4 x没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
2 v  ~1 w: X4 ]+ U  S) N" O9 f4 x- c7 X8 w0 U
2 I4 [/ H& {, _! c5 o
8 x# N2 ]8 H$ k3 V( \3 M
6 Z: j4 h. D+ D" }) o





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