嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
  E' M1 p: B* i# t( z
% r% P7 j7 |, K8 F9 KOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>9 t  ^: A! X: Q" {6 z$ z
#include <unistd.h>$ c7 _4 s) b" a* N
#include <sys/mman.h>$ _9 A6 M1 H: _/ ~
#include <sys/types.h>
  U/ [& a6 O4 {! @) L* E- y* b#include <fcntl.h>
' [" x* S6 v, o3 u1 G9 k
, i! r6 R6 O' b9 O+ z#define SHAER_RAM_BASE_ADDR    (0x80000000)   
4 d% l$ ~; N  |+ _& V: d1 g# N1 w6 B; t: C2 x
typedef struct- u  r# ^( C7 x' D3 c' Z! G" M
{6 v3 V# W1 \0 N! \) y  p8 T0 a) x; K
        unsigned int a;
  C( o, P5 Q- i* Q2 }        unsigned int b;9 g  b3 n( w2 a9 ?1 ^$ v* A+ R! ?
        unsigned int packet_cout;1 z8 b/ g) D5 l1 V
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;( `! x6 [1 v* L( j; @; U( h
% d+ `/ t) X! ]- Q8 W: @- ~' G6 c
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);" O. @. ~, }/ U$ N1 H) Z
unsigned int count_copy = 0;. n9 M  I& W: H: N

- S& j, W0 r6 w# A' s
) \% c4 ^  N: w8 B( {int main()# l- q! G0 q5 K. g- P
{/ U1 R6 c3 W; p4 \1 E
        pRX_MSG_PROTOCOL pshreRAM = NULL;
  p4 c( C& k! O6 }: H: K4 f8 l, _        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
" ^8 V1 L' I( ]; h8 z0 d
6 c1 E1 ~: W1 O; B  c" J5 a        while(1). B  ^6 b7 T: V& O
        {
' Y* V+ l6 ^- X7 O" Y7 l# z1 }5 G, J                read_MSG_buffer(pshreRAM);% b% r' W7 L9 r
        }               
1 e- t( y+ U0 G2 c# u}, x( p* \# M' P) m2 v7 ^; Y1 j' `  H

7 _) u. i, P5 q* `- N; C% t7 ^void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)1 I* L4 c) }: {3 _4 g6 Q
{% }- P# W5 [  _6 ?- z6 u# R
        RX_MSG_PROTOCOL buf;- ?! _' Q- @" {4 f- \& r" X7 _" s$ U
        
6 Y" D9 _" H" E  n# v" `* Y        buf.a = pshreRAM->a;
/ o8 o/ L2 O/ O1 L+ N        buf.b = pshreRAM->b;
; y$ H5 `+ I$ S$ p2 q        buf.packet_cout = pshreRAM->packet_cout;
$ |9 z6 E+ L" M! }0 |        # Q6 m8 C% a1 h% E
        if(buf.packet_cout != count_copy)
& q% U1 L* r; Z- G$ _2 g" n# h: x        {( {2 J( `8 f& z  g9 r' ?( Y2 R) _$ r5 f
                printf("a is %d\n", buf.a);
, n! m, |7 t6 J- u5 a+ v                printf("b is %d\n", buf.b);
/ u/ H  K0 j) a# q9 U* z. p5 X                printf("count is %d\n", buf.packet_cout);
  X0 @0 ?  `5 M                count_copy = buf.packet_cout;
$ V+ w$ k2 J. A* V        }" Y3 ]* ^" w  e# x$ R/ D- c- q
        else( \0 U, F3 n+ q" d. i
        {
7 i- M1 e+ e& h8 e9 M" J                printf("No effective message!");* B7 F' w: A6 G% ?
        }
  a1 _# v1 w; {/ t6 ]}
" L8 c6 R2 E7 r* N; e* P5 V' y& u' s, O& y5 c/ E
8 z( Q& A. L0 B8 L* D4 ^, I
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。' Z. J0 ?6 F4 U. t! I  k+ i) U
使用下面代码,对内存使用了mmap函数后:2 u$ C7 x1 U% B" w6 f9 O
#include <stdio.h>" O/ f! Z( {5 {" h
#include <unistd.h>8 N6 i# \5 i, g5 j8 X6 ^! h
#include <sys/mman.h>5 p& s( `! I5 r3 p0 @/ A. d4 `( N
#include <sys/types.h>
$ M- ?1 E* E; l' ~#include <fcntl.h>2 I6 \; d& {4 @  R& }, }9 `5 N/ S) W7 `

$ Q3 r. A& P8 e0 |4 Z, ^) @- `. a#define SHAER_RAM_BASE_ADDR    (0x80000000)
$ i; C7 g7 X) z8 v#define SHAER_RAM_SIZE         (0x20000)   
2 ~4 d/ P' V  Y2 l8 ?) D
3 @9 \# m- H5 r; s& _( etypedef struct
; r9 d1 b  a' c{* H+ B& O* ?4 H+ R7 H
        unsigned int a;
9 w  w( H: N# X9 s$ V        unsigned int b;+ J- \3 G; p' m& @
        unsigned int packet_cout;& R  y8 T6 g' X7 H
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
+ \. w  r! P$ F4 x9 k2 q! `. K/ X. M
void read_MSG_buffer(int *baseaddr);
, [' O) }; W+ s$ r/ c4 M2 Dunsigned int count_copy = 0;+ |6 |: N( P8 x7 Z, {- ]; I  U

* X3 O# C" R9 m$ X/ Qint main()
$ P' K- O; u" x: r! i* B{
- |# K" G; U  a, L4 {        int fd;9 C& ]7 U: H! o/ V( |! g1 M  R
        int *mem = NULL;
$ X; z- ^  `1 Q! \
/ {4 H( r& e4 `6 o. D# e7 c        if((fd = open("/dev/mem", O_RDWR)) <0)
+ H. H& ~2 x+ I: u4 [% J5 Q, W        {
# r8 [6 j, f9 \+ D                perror("open error");
. ~5 \2 l: r' u$ ~                return -1;; I: }( P5 I  s) @+ j
        }
7 @3 P' t- y+ Q* u        
. t. \2 E- n$ c( }% Z- g$ p+ {        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);8 Q6 y% p! t, U- C$ g

% B+ I+ t( Q8 {% ~% y4 o        while(1)
; A% ~4 f7 c* X) g$ b        {
% ^* {! c; m! Q( n                read_MSG_buffer(mem);
% n' R: d+ k4 d2 B" Y/ M0 _) F        }                # {+ @* Y" e: u: ]% u5 I
}4 a+ L# J; `! b' z. g/ i
5 m1 R7 E, s9 i8 e
void read_MSG_buffer(int *baseaddr)
$ X* P4 t/ X: L9 |+ R2 A& p! \{3 h* Z0 W4 K4 x* t
        pRX_MSG_PROTOCOL pshreRAM = NULL;. W8 ], N5 d3 I
  g7 d6 F9 a) N7 e9 s
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
7 X7 p0 i: z1 ~5 x& B; C# u  z6 J- c6 o
        if(pshreRAM->packet_cout != count_copy)
: v+ d& z8 ]$ p4 D" \8 \3 W+ c        {5 n) R% Q$ y) I, a3 m9 K% u5 c
                printf("a is %d\n", pshreRAM->a);
  Q& x9 }+ H' ?: N) j0 o9 `                printf("b is %d\n", pshreRAM->b);4 q9 e9 A) ~  m
                printf("count is %d\n", pshreRAM->packet_cout);( [( a7 E8 g; g4 f" L/ E3 d% v. o( j3 Z
                count_copy = pshreRAM->packet_cout;
( W1 _0 m/ T! D& ]. g        }" W4 I6 |7 c# ]" F
        else  F5 q& T. M; l% L2 P
        {/ ^  w$ A3 N3 {- ~; C& S* C
                printf("No effective message!\n");7 \1 ~# C+ y) x: }
        }
4 h, {' Q9 V6 |9 \* y# ^! N}
2 z4 \7 J: s+ X5 e) U3 B  E) M1 i6 o: t+ Y
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???* W: m0 I( z% L. f/ s3 [) k# b
2 D8 d; x3 b. M
* o' `7 \! N& n% m5 ?* K7 x+ F+ G1 b
  _3 P$ z. ~2 D: l" V; `8 \, V# t7 `
; W8 T8 p0 B) P) _9 L, G





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