嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 4 e* @3 F) j0 ^! e3 o2 J* T

, ]) ~( I% m) y7 X7 ~' v' v. x' SOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
$ x' t6 |% q" u( A4 f6 f#include <unistd.h>& M) ?: o- E, l
#include <sys/mman.h>
  n" y5 F3 g5 a) S#include <sys/types.h>  J8 N/ x7 t1 I3 n( K. N
#include <fcntl.h>
9 S: m( ^$ b1 S4 y- M1 |, o4 s3 r+ A/ K, e
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
3 c/ R* j2 M- L5 d1 H" y
3 H" c! V" @. F8 Q3 ?5 Atypedef struct* m7 ]9 c/ R) b" E5 m2 |, k
{" g; o9 S, Z8 E+ s% x& o
        unsigned int a;
) P$ E. F7 T+ C0 X9 M6 b; p+ I6 ?        unsigned int b;
& j7 \6 N4 Q& i0 @0 H" k1 R% _2 F2 {& w        unsigned int packet_cout;
& k; w5 G1 h, N6 ^( @; c}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- p4 ], H6 {; f2 }+ _4 k
( W8 L# V8 a( z: }, V7 y6 m+ D$ `void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
) `& U, U1 I: B; O' M, Eunsigned int count_copy = 0;& {* f5 F/ _* A, N4 ]

" M; A  Y& w" C* s3 Q. j& l* t  y( G( t2 q, r. s
int main(); L/ {$ k: E: R' C) W* g2 p3 k
{# m2 j; Z1 V3 W5 b  ~; I5 _" J
        pRX_MSG_PROTOCOL pshreRAM = NULL;
" s6 X. _$ ^$ T: e/ ]+ ~  S- d        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
2 ?% d. X, R: o, v- {* q8 q
$ E0 `& x* X& M6 x7 w+ P) X$ F        while(1)
5 ~9 X4 {& k& n        {: p& C' N7 q/ x$ ~. j4 l2 t
                read_MSG_buffer(pshreRAM);) j1 M  M( a  a2 S9 p) b
        }               
$ h1 m- {6 U+ ^6 A5 O4 {5 j, x1 A}
0 C0 z4 {5 m& W  e9 g: Y$ \  W" a3 o* s+ b) _1 r# q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)/ T6 Y3 z' Q. y* t8 [
{
% p4 a% N$ T7 W* A# A        RX_MSG_PROTOCOL buf;
2 U0 Y2 G% j: e- e+ ]        0 x, Z) Y$ K/ k' _+ A
        buf.a = pshreRAM->a;
6 g$ J; C, {, o        buf.b = pshreRAM->b;  H! R& y( J8 U. B# X
        buf.packet_cout = pshreRAM->packet_cout;
! B, |: W: U, z( ]        , T% O+ y' T+ }" ?+ J+ g' z
        if(buf.packet_cout != count_copy)
6 e% j: f1 s, Q7 U9 c+ o        {" h7 g7 C7 b. t; z. F8 R
                printf("a is %d\n", buf.a);: N6 c6 S; Q6 j9 F: q
                printf("b is %d\n", buf.b);
2 N4 h) T% m" k6 n4 k4 V+ I6 g0 W                printf("count is %d\n", buf.packet_cout);
1 K9 S; A! _9 E$ `( x; Y5 Q                count_copy = buf.packet_cout;4 H$ e7 X& Q# r7 V$ M# k6 E% M% Y; b
        }! {6 Z  @$ d# e* r; K
        else
8 A3 }& [; j" U. a$ ?        {
6 r" ?2 u* k3 P9 X                printf("No effective message!");, M( @  l2 m' p: n" N% Z& j
        }
0 z4 C+ T2 b+ r2 m% \7 N9 F$ O: }}
% D( u, w& A  A- Z3 V
& y' T1 G  X4 P/ |' o5 f
, W& e0 j/ ^. z, y* `" U  n' J; I& y! l但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
7 q6 H3 X; f+ |" U5 @0 ~* A# x' B使用下面代码,对内存使用了mmap函数后:2 L" H/ Q- x9 c% M+ \; w
#include <stdio.h>" ]9 ^' \/ r, k
#include <unistd.h>+ C0 E/ o, J- {( T
#include <sys/mman.h>  x7 P# s( T( r9 e' e  s& X8 x
#include <sys/types.h>. L9 F+ J+ z5 I
#include <fcntl.h>$ w# ]; S; i+ F2 G0 k& Y
, Q6 Q+ N% ]2 J9 p" f
#define SHAER_RAM_BASE_ADDR    (0x80000000)
. {9 U7 ]3 O% r6 n5 M#define SHAER_RAM_SIZE         (0x20000)   
  f3 q, y; ~% A1 g# I  f2 G5 \! d' z+ C8 O
typedef struct
& ^8 {  ?7 V3 i( V7 T{3 B3 K4 j6 b, q* t. t
        unsigned int a;
- J  @3 P# H! n$ S: T/ k! n4 U; i        unsigned int b;
! H# A2 o* p: x' V        unsigned int packet_cout;1 W% a& }3 e8 H- _6 Q% _' w/ @
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;; r. @: h% Z- U6 i/ ^
; b" F, B# u  ~
void read_MSG_buffer(int *baseaddr);0 d* L7 e, @. G# B# s( [8 w' Y0 Q' w  Z
unsigned int count_copy = 0;
! @# S7 n' S' |& N# J
" |% A7 l  q: J5 j, ^( L, rint main()( k; q# P  r, U' q1 \. H! y* [
{9 t! t) `3 E) Q" B( J
        int fd;- |$ m  n9 W2 {, `1 w0 J! ?/ J9 H
        int *mem = NULL;+ B* ?. g4 E# q/ h4 T

, n% R+ U: c5 S+ Z! _, v4 n        if((fd = open("/dev/mem", O_RDWR)) <0)) `( M$ D) S; s1 G9 t0 D* U
        {
2 |- m6 K( a) N5 Z& z. P4 q                perror("open error");
3 D! l+ N1 |- q: H5 l! B0 A$ u                return -1;9 f1 L* \3 v- p4 m+ Y
        }
5 \! w: y4 q1 N; Q' f6 z        
. ^# ^& q+ K; j! Q: @' t1 k        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);" r9 n3 u* S) _/ J3 |7 o1 i* l* T
. s% |2 J& t3 {# @: V5 A# m& W
        while(1)" K8 z4 ?! p( Y5 W+ j2 U+ y
        {
8 ]' X2 {5 {* k7 B) q0 T                read_MSG_buffer(mem);
& {) W6 B7 \  _$ q        }                ! g* B* i. u3 |. F
}
/ _/ @4 _& u2 b" d+ Z
) x& {8 M! g& Svoid read_MSG_buffer(int *baseaddr)
& g* O% M1 a. n# R$ o5 I% \{
9 ~: Y* p( h+ q6 A8 ~6 P; `# b7 A        pRX_MSG_PROTOCOL pshreRAM = NULL;. U2 A* B1 q5 T  X: g
; \& v) N1 }" x4 c
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
& s( k6 w) u9 D# S& f4 u, f+ b
8 E7 I" a" S! W+ i2 i        if(pshreRAM->packet_cout != count_copy)
$ V( j2 @* j+ w        {
/ w1 f, l5 z0 E  I- o3 \                printf("a is %d\n", pshreRAM->a);
' @" p6 x3 D* [* y6 G  E, W                printf("b is %d\n", pshreRAM->b);& b  ]) w8 a# Y$ P5 {
                printf("count is %d\n", pshreRAM->packet_cout);! D6 K( m. |& D& _
                count_copy = pshreRAM->packet_cout;
  j' I% e  P$ U! W) F. i* H3 P; r- v        }
3 c% S' f2 X) _        else
: f$ a7 E" n1 r/ N3 V/ m; g, r        {
  ~3 o7 \7 h$ M& O& c/ n. G1 U) p- x                printf("No effective message!\n");
6 A( F, G3 y* R$ d. o6 V1 L: D0 f        }
* U, _$ r0 I; n) S}9 F; a: r# g4 b/ j7 c5 @
3 G6 T2 j: H8 Z6 h. _
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???- i. u8 ?" [2 m$ L% t
7 A7 H1 w, x7 m
! O$ r5 _9 a; d2 m- A6 H" K8 l7 x7 u
3 E0 r! b  O3 y2 L: }

( U, P3 D6 u: f7 I) i




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