嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 + u) B3 n6 r2 J/ N: z" A  X! i

4 \! u" j4 j* r. M/ O- t6 D0 e$ yOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
3 k+ I- A0 r8 j% \7 L#include <unistd.h>
8 {* Q+ Z* `# q' N0 E0 X) s: W#include <sys/mman.h>
- `8 d9 }, ~8 S#include <sys/types.h>* `9 e# O. |) w1 d3 u9 l
#include <fcntl.h>
3 Z; T$ b# ~/ H5 b' p# G& k9 U+ R
0 w# c7 q) t) _% O9 @#define SHAER_RAM_BASE_ADDR    (0x80000000)   
: d* D7 C3 i/ ^* T
3 p/ b+ L: h+ J! U* ktypedef struct0 g. M% G) y7 ]0 ~. x* V
{
: S3 e" Q$ N; A2 r        unsigned int a;* |9 h' }* V0 ]9 `, f! N/ J
        unsigned int b;6 @5 {5 e- o& o
        unsigned int packet_cout;
6 h( h/ C- i/ R( X, K: Y}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 M, X3 |# D8 |0 V! X& m3 v- b, F* i( W7 y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);- C- l7 B+ H& [: e
unsigned int count_copy = 0;
1 z2 R4 k7 [1 @% `  @
8 n# m- ]1 G) j3 D% U5 z7 y# ?9 M$ y9 P3 f7 b. \6 q6 {5 Q! j! v- t
int main()5 m. ?9 J: U+ I
{
  y$ V( I8 G/ [5 G- y* X. R4 A        pRX_MSG_PROTOCOL pshreRAM = NULL;
9 [- w# ?/ }5 f        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;; ]; C& ^" `) N  f0 D3 z

) s) W" h& E) f2 L        while(1)
# X+ K0 |% n0 H  w9 _        {
# h$ m9 u& J( x& X                read_MSG_buffer(pshreRAM);
9 l/ l; j4 X1 V$ ?6 T# j; D: ^        }                : F3 B" q1 |5 a9 N
}8 l/ d* l; e; x& e0 y. _
3 w% f1 n# s  R/ y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
9 O6 e2 h& H  G. F  R9 B. P. d{
( U- y( {' Y  k        RX_MSG_PROTOCOL buf;( m1 S  s# ~  \5 }( Z9 h+ z, r$ f
        ! `5 n/ C+ t3 A6 I
        buf.a = pshreRAM->a;
0 [7 A5 @6 {. I2 d        buf.b = pshreRAM->b;
" e% E. a* f* [! R8 d" `5 q        buf.packet_cout = pshreRAM->packet_cout;- d# ?1 l6 _  u+ ~- S& b. ?9 r! N6 N
        
- l7 ~( v. E2 B& H2 @        if(buf.packet_cout != count_copy)' O% p. j1 r, T* h- ^2 u
        {, z* v; I0 i2 M
                printf("a is %d\n", buf.a);
! C8 G7 c# _% g                printf("b is %d\n", buf.b);
$ T- B5 r7 D) {4 ~                printf("count is %d\n", buf.packet_cout);8 v, j4 k1 Y" t& C5 `" `$ L1 @% c
                count_copy = buf.packet_cout;8 v4 T  N0 q2 e
        }
/ q* q0 k2 R& w3 {6 I        else
, a% E" D; t/ J  q        {+ L  ?6 ~: |+ }& t
                printf("No effective message!");
/ x) O3 Z3 O' K# D2 d* h        }6 w  g8 E4 V7 S6 O
}% K$ `# J" X& B, F/ N  N7 k$ t
( p7 b* X, b4 L$ `8 f
2 G9 B& J0 j- ?$ T; f
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。0 S( u; t/ y; g& [
使用下面代码,对内存使用了mmap函数后:' w( C# m0 u/ `# n$ G/ l! o
#include <stdio.h>
8 ^5 V  Y1 `0 o) t% p1 O% r#include <unistd.h>
' X* B$ _" s) v% j/ s9 ~1 u6 Z#include <sys/mman.h>
" e3 a# a2 d/ ]% k8 @# m0 i#include <sys/types.h>, H1 p4 z0 @; n8 M. W
#include <fcntl.h>/ _) u0 i* v, J& Q+ u
6 a4 D; r9 `9 X: U$ V
#define SHAER_RAM_BASE_ADDR    (0x80000000)
7 ~8 m8 V' `2 U: B" w6 G0 f( r#define SHAER_RAM_SIZE         (0x20000)   
8 A5 J$ R: N6 c- V7 ~# ]; _) @" z. p0 L% c
typedef struct# O+ f+ Z$ Y& P
{
) H* H+ ]% g  s  q+ L$ C        unsigned int a;
2 ?/ \0 J- G8 x- ~        unsigned int b;
$ o- M4 l4 E3 j# Q% B        unsigned int packet_cout;9 X/ s" L; q& N) a! K8 A4 k( m
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
+ X, L, g% t9 ?9 j# b" Y5 d5 }
" f% j; E6 o7 F  f1 [void read_MSG_buffer(int *baseaddr);
( \8 C( Y- |+ J% Q' Q5 p% @unsigned int count_copy = 0;
! o+ J& ?. Z1 w- u/ E
$ y, c- t* b+ T0 hint main()
: x. M" D5 S* x" R. o{. O( p5 d/ u3 @1 x1 ^+ v% A
        int fd;6 x) T% W% O- i2 ]
        int *mem = NULL;, F* ?" d# Z. O8 Z, s7 |# l% I. @

) _; x- D" u. s& y7 m% e, T        if((fd = open("/dev/mem", O_RDWR)) <0)
8 D  c$ c& R% F        {; N+ ~, c* C% w: y! V
                perror("open error");" F' y* V" K# y* r; {
                return -1;
3 t6 q9 L! U8 i5 u$ }' Z        }$ V3 X1 s- y1 ~3 T& s. @
        
6 Y+ H" j1 P# N& ]' G        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
/ t) e/ i/ ]7 ?# g9 C* o1 l% x0 y+ [! A; f9 t
        while(1)
/ r' N4 E" u, g, Q  z        {
1 o9 I3 @% d" G/ M$ M! o                read_MSG_buffer(mem);
: l5 r4 T: @. B$ ^# Q' p        }               
8 w& ]$ e+ P, `6 W3 V8 S" y% ?: B& z}
# Y$ X4 J+ E, Z! l8 ?' B" t6 ?, {
6 u+ U0 Y0 Z0 @; E% Q* L$ x$ Wvoid read_MSG_buffer(int *baseaddr)6 [8 |8 g  E0 M, `% E
{
2 s; [) W7 {. s$ S' y4 I0 P$ t1 @# F6 F        pRX_MSG_PROTOCOL pshreRAM = NULL;, x! a  w9 |3 b$ t' h

0 S3 W% g0 C, ^0 f2 C6 w- `        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
: g. |7 ]+ U' s# e# ~+ w0 U/ Q1 G+ v
        if(pshreRAM->packet_cout != count_copy)
3 N9 @! C2 L8 V        {! O, Q  f2 N; u  Q
                printf("a is %d\n", pshreRAM->a);
. F" Y  @3 \9 N6 ^0 I1 G                printf("b is %d\n", pshreRAM->b);# w9 @% p7 s2 s4 w6 o
                printf("count is %d\n", pshreRAM->packet_cout);4 ^0 t7 W- j7 o$ |; e2 Z
                count_copy = pshreRAM->packet_cout;9 b# c6 Z3 z5 b; V
        }
. B8 `/ Z% ^  ^6 U& p        else
: l- w0 E- U! }# H( m2 D0 U$ o4 k        {
8 Z, E: s% O) [% Y/ J$ A5 A                printf("No effective message!\n");- q  j  ?0 X' Y9 O
        }
: n2 _6 r5 i$ F! B}
7 g  g/ _2 f% b1 |1 `3 H; R3 {" q
! `9 h' l7 h1 N1 l$ l6 C/ S$ k& [6 Y没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
* _, N* }5 _) {  W
+ _9 |2 o2 |2 U) w5 p8 f% j4 v: Y5 r% h* b
% E+ x% a/ T: k; b( C# a

$ E5 r2 Q: D  M0 J( A) Z4 X7 c5 n




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