嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 5 r7 ~. O* u& @; X2 {& Y( Q, H
4 Z- m3 ]8 _& C% G
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>4 x9 K+ m2 A) D- A
#include <unistd.h>2 ]( f6 W8 N- @) [' L- F$ i- b5 I
#include <sys/mman.h>. q, z2 Y* ?" K5 S. \
#include <sys/types.h>* N: j$ m/ F, `
#include <fcntl.h>
% r* ]" X+ ~. e1 S( j- V
" Q8 b! ^) g; A2 N: U#define SHAER_RAM_BASE_ADDR    (0x80000000)   
: W$ P4 y$ G0 U# [4 ?* d; }7 t5 D8 G" W( v$ {
typedef struct
" w- M- @- @$ M  {5 t9 H{
7 H5 C. \8 R0 W: C        unsigned int a;
4 }% W" Y2 N+ N2 F        unsigned int b;
+ Q7 d/ U2 z0 x        unsigned int packet_cout;& s# R1 A' W. Y* D6 V9 `5 J- ~
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;# Z) i8 ?( K; R$ }  b

, E' q& m  i, F4 l7 qvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);) P! ^/ N( O. g4 C+ a, {5 f
unsigned int count_copy = 0;
/ A# {: f; X' P+ [9 ?( H: w: y
; z7 ^. j' P2 F3 R
( F: w( a' ^# _) @/ D1 S1 wint main()& a- P7 }9 N$ L2 q
{
7 L. @; U* s* S9 @$ ]        pRX_MSG_PROTOCOL pshreRAM = NULL;
1 Q; Z( A& R" [  [% P        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
  [. F9 ?9 L! N5 H
& S* u+ v( G5 i! k+ R! @& K        while(1)' ~: `' u7 N0 D+ y( _8 B* |
        {$ Y+ r) P' [. \, z1 i
                read_MSG_buffer(pshreRAM);
3 ^- t( G7 [) {! x- r        }                7 R2 H; w: C5 v9 Q  F
}3 r; Q& h2 {+ k# w6 l

& j6 R7 Z& w" U  zvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)* A' B0 e/ m  I; J$ `2 e
{& g/ ~# J3 q, @. _5 ]
        RX_MSG_PROTOCOL buf;7 H1 B) K' y: s. X9 d1 O
        
  W1 K* s3 p% Q7 T8 |        buf.a = pshreRAM->a;2 o' g% p# a- L
        buf.b = pshreRAM->b;
( q, W6 j3 f- X+ ^/ {% B1 u0 L        buf.packet_cout = pshreRAM->packet_cout;
5 `) ^, n% E+ k7 f        
! ]7 y4 E/ m3 r$ v( c        if(buf.packet_cout != count_copy)
- |& T# {) P: ?8 S, S( m, @        {* `! q* D4 t" h  w7 X
                printf("a is %d\n", buf.a);
' J# L+ }0 X" V' {                printf("b is %d\n", buf.b);
( x) B" ]* [- E: R1 v  ]+ z* F                printf("count is %d\n", buf.packet_cout);! e7 D4 D& w; t9 K9 Q/ r4 R
                count_copy = buf.packet_cout;
# Y) Y: ^1 z8 D  e2 z        }
- ]" Z/ t8 c) @/ r2 X# v% M8 F        else
8 G0 v) u* G% P' }        {
% g6 k5 i3 v0 ]5 |3 y  X                printf("No effective message!");
3 ~% y3 d3 I. Q7 Z        }( X$ M  E0 O$ F" W4 e$ }; \3 L
}
2 g, b' A4 x$ K- i
& e5 d! y5 b* E( H
& A, C* A! T, r" P3 ~% f8 A" F( E但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。  ~- k  M# Y. l; ]0 `4 n  L, n/ C# p
使用下面代码,对内存使用了mmap函数后:
) C+ v$ k6 U8 g5 g#include <stdio.h>
! K% M3 e# H/ A+ m#include <unistd.h>: `7 o9 [# w; i# z% O' }
#include <sys/mman.h>( c& A, ]* i5 S: {' S, t7 \
#include <sys/types.h>
  @% c2 r+ }( j/ S- v#include <fcntl.h>
/ R( b( ~8 z* m5 V4 i; i# A+ n- k3 y7 U
#define SHAER_RAM_BASE_ADDR    (0x80000000)1 L: ~% ^3 j8 q/ S) J
#define SHAER_RAM_SIZE         (0x20000)   
- `! p" o0 Y" |/ t  T6 l! h5 s8 W/ {3 v
typedef struct
" e% {' K  ~# C9 r: J{/ T7 ?) Y% J  ~" g
        unsigned int a;
- k% S. z$ M5 [- @        unsigned int b;
! V) y2 L  j0 \% z        unsigned int packet_cout;
+ ]% N0 N* X2 i: S0 A/ l1 j}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;; E4 {1 M) n) O! s; }1 `# s
' U7 `0 e% L3 K9 j9 V. b8 }
void read_MSG_buffer(int *baseaddr);* {8 O, o/ }2 j* B3 p: D1 U
unsigned int count_copy = 0;; K: c/ z# ~  j1 g3 C7 a: }
1 E6 i3 U+ i4 ]( q6 R" X( `
int main(). _4 c- x9 k  o, b% L! Z
{
4 I$ r5 }/ Y4 \9 U; X/ r        int fd;
, Y7 V# R) {. {+ K        int *mem = NULL;5 ~* W2 Y  M# t$ o, t, b9 N
% f, N$ V5 n; q+ E
        if((fd = open("/dev/mem", O_RDWR)) <0)
1 C3 \3 G. q. V" R        {# {2 [9 p: O$ Z4 S3 W! K0 V
                perror("open error");7 H# A0 L& [: _$ d+ S
                return -1;
: C  D6 D( y: d& p# }1 T3 E        }) b7 T! _8 N- {" \% y8 d$ t+ F
        5 }5 v# x" ]- Z" _- A
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);+ m# x- k: Z' Y1 I
% y; O0 I% G, y, Q0 J) W; m
        while(1)
( i9 M! Q1 ?4 @1 Y        {# l1 L$ v. i; I
                read_MSG_buffer(mem);
6 ]* K) R2 Z2 R7 [2 Y* a$ D        }                8 }% T2 ?, }9 R( W
}$ _" k5 l4 o! m7 D4 d3 O* t

6 X, X& K# @' Svoid read_MSG_buffer(int *baseaddr)
* o$ G' A; z4 {! D4 A; B" q5 V: ]{2 ?  Z  h+ v3 v" R: o
        pRX_MSG_PROTOCOL pshreRAM = NULL;' H) ?  _1 x; j
3 X5 v0 S! t! d8 m, \8 S
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
3 o1 V. c$ s- V7 k
8 Q: q  h9 i) D" [! Z7 |" L        if(pshreRAM->packet_cout != count_copy)
7 H1 _" O  r8 h2 N0 e; {& }        {
4 `; Q# b4 G: ]' H: ^# Y                printf("a is %d\n", pshreRAM->a);% y# Y4 F, S* }7 L7 _+ p2 \, _
                printf("b is %d\n", pshreRAM->b);
+ n0 z* B4 K& P+ L                printf("count is %d\n", pshreRAM->packet_cout);4 Z2 T9 V* D0 g  O
                count_copy = pshreRAM->packet_cout;
4 ~+ j* d. A$ C! u3 s& p' I$ {) C        }; ?7 r! p; `& F& ]
        else# q$ E8 v+ f4 q7 ^: w* e% d
        {, Y& N. U: y0 F2 a
                printf("No effective message!\n");  z: x4 v; F% X. p4 r% K2 T# u5 T- f
        }
5 `4 }+ |$ g- @' O7 V3 k}
5 a4 x( w; l1 [* U4 |+ {
+ ]2 _; e9 [- o" H没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???6 v! F1 |4 c+ J, ^

4 o, h- c3 j6 P5 B
" K( u' u; ], W- P& ?+ [6 t7 w8 {; |! a. M# r

! P7 Y  _* Z5 h5 Y1 A




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