嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
: i: W7 M- g* F8 `6 }- |- v
1 ^# R2 B9 ^( N2 A- t8 x4 AOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>+ e# F9 E& O* n1 Y0 b
#include <unistd.h>9 k7 g5 U- L6 w9 J' ^. l! M7 V- K
#include <sys/mman.h>
1 o( b8 b1 G# e* W* R; B#include <sys/types.h>
! ]  c/ \7 v, L& O, ]#include <fcntl.h>
, o- Q+ S( i7 `& b( b) g4 l  M7 z8 B( c/ s
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
1 v) z$ D6 B; M! w0 W) o9 U+ W* f; R! D) `6 z$ g  N: ^
typedef struct
4 l, x; Q" k6 Y& ~{7 }) C. o6 m2 Z$ E7 @
        unsigned int a;
4 r5 O, j! K9 N# r. N. u2 {- c        unsigned int b;
% a! x: W+ h7 m. P        unsigned int packet_cout;9 B  f) ^3 a! B8 X& U/ v* n
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! v( l8 }- x- Y/ Q& Q1 g7 {2 C0 _* F& b/ c: m% d
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
$ f; `3 d2 N# c& b0 R2 ?* gunsigned int count_copy = 0;
: t* K$ X$ K7 _0 M, S: J' }9 \7 C0 O0 |
3 \, o* \, T; l
int main()
: R2 D5 P4 D5 S6 [& }{3 L# y; _0 i8 B
        pRX_MSG_PROTOCOL pshreRAM = NULL;+ Q, H+ w' }5 D5 R. Q0 R. v1 i9 u1 Q
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
* u' S7 r# s: `
& l1 z. I8 n. t1 l' k5 W' D2 n        while(1)' ]6 [9 N4 z/ T, F/ {
        {" A8 j% \- M( M# i2 ^
                read_MSG_buffer(pshreRAM);9 Z) m: E6 ~3 B- a
        }                ( {; }6 `0 d4 N1 A4 a& ]& U9 Z
}+ |8 d# n6 q3 K5 S6 A' P7 ^, p

* _/ ^: i; `2 `! H- bvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
: z3 C- w+ z3 n1 l: r4 A" m& ^{
5 d3 l" X0 \) `$ ]        RX_MSG_PROTOCOL buf;9 O9 B0 v- I! k0 I" P9 `3 G
        
! R, J) x" d) a0 {! T4 Z5 G9 m        buf.a = pshreRAM->a;
/ i5 F4 v* P' g        buf.b = pshreRAM->b;
& B- Q5 Q8 `' ^5 k9 I' S        buf.packet_cout = pshreRAM->packet_cout;
: B4 r) X9 D& B; ]8 E        
$ ]2 b. Y- \/ {" |        if(buf.packet_cout != count_copy)9 y; S; J8 C- o' M, g
        {- l4 v- G2 Y- Z0 p5 n0 p
                printf("a is %d\n", buf.a);
2 C9 O% c# m: u0 H8 p6 l7 S) T                printf("b is %d\n", buf.b);/ z: U/ T3 ^' E! I
                printf("count is %d\n", buf.packet_cout);* X3 y* o# [$ f% o6 H/ k, y) l
                count_copy = buf.packet_cout;
# T* n) s! l# N" p  U3 y9 c2 i& e4 S5 _        }% {- _: m& p- k
        else
# T3 a2 L5 z' t3 q4 Y8 P        {
6 O2 @- ]3 Y9 [$ ~+ ^                printf("No effective message!");; u/ ^- T' o, F  h+ L7 e
        }
4 X/ z2 x+ q5 K}
) B, d- H( m2 T; A* U/ ~# U
/ b# m3 u. w$ R1 t) W3 P
+ r' e! n' S/ g- F$ e3 e( ^但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
7 M& |+ c( {9 F使用下面代码,对内存使用了mmap函数后:
# c! L; U# f( e5 o) R1 A! @#include <stdio.h>( \% W4 E4 c- B/ V/ ~, c- p% O
#include <unistd.h>  q, b9 c$ H% d+ C* L
#include <sys/mman.h>
$ R' q, [' s, b#include <sys/types.h>
/ c/ T# a1 h/ p  x. x; j" ^9 w#include <fcntl.h>0 x: c/ A. o1 ^9 v
$ Y/ B! b' {1 z! X/ p7 u7 s
#define SHAER_RAM_BASE_ADDR    (0x80000000)
7 Y; i- h7 X: ~7 m#define SHAER_RAM_SIZE         (0x20000)   
# w6 w9 a- D% O# l& x
1 o7 U$ R- f% xtypedef struct
: L3 U; a6 [! F  r$ X% c2 Q{# x) F0 L# X+ m' w6 S# e* N
        unsigned int a;
, j6 ^3 y) j9 m9 a5 G. n, E% }6 O        unsigned int b;0 I' J) [; ?7 h9 Y0 h2 E8 m
        unsigned int packet_cout;
2 o  Y" n( \9 b7 `2 v$ \& H}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
( B; e3 n1 p% Q# q2 l& K! H
& l- `- S& v/ [+ r) P" d5 `  nvoid read_MSG_buffer(int *baseaddr);
1 \& ]4 B) J- L+ Eunsigned int count_copy = 0;0 j$ }% D& A1 E8 P

5 o, z! l% h* Q8 d0 Gint main(): P. g( _4 \$ N3 ]$ T/ P
{
1 U0 R2 r. F( G. s" P& ^        int fd;& J2 ?# N$ j! R. f, H
        int *mem = NULL;9 K. Q+ U1 Z" |) R6 y, M

& d4 |3 p% k) B8 z        if((fd = open("/dev/mem", O_RDWR)) <0)$ H5 q. u6 \+ Z
        {, e  M* H4 n5 m; ?& S
                perror("open error");" N7 j4 Y  N6 ~1 O
                return -1;. G& m7 R4 s* W' N: d/ i
        }
/ J: g6 B# G% z: Z1 M5 h        
, u1 T/ I! K# O! t3 n. P' t4 I$ B0 z        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);& Q7 s2 `6 K$ M1 Y9 h' v+ ^
/ ~. q0 _+ h+ X
        while(1)5 j4 B) C- j2 H; ~+ Z
        {& E. g% R+ K7 B8 Z! ?) f/ X4 E
                read_MSG_buffer(mem);' a+ R  U  U9 F/ g
        }               
) h  J* X8 `# Y+ p# A8 Z) L' V! C}6 i0 O( J; E1 G
# m" z4 `7 k' E, W
void read_MSG_buffer(int *baseaddr)
- L; _( P9 N  b2 u{
7 k3 `" q, ]9 _/ t$ A+ t/ E3 ]        pRX_MSG_PROTOCOL pshreRAM = NULL;
6 p0 r+ z- N0 t! b* G* {2 h- w0 p7 }: u& `, P4 `
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
8 z% O7 Z; S$ A% H4 r/ B$ f, S
9 @! k% I5 M" p7 U        if(pshreRAM->packet_cout != count_copy)
& d% E; e, m. N  x        {# W2 {9 y7 P" e0 y) M/ T
                printf("a is %d\n", pshreRAM->a);$ Q6 R! X# x5 G
                printf("b is %d\n", pshreRAM->b);) x! D# ]& z# u% K
                printf("count is %d\n", pshreRAM->packet_cout);
1 v8 W5 e8 S) Z                count_copy = pshreRAM->packet_cout;. ]+ D; |, v* j. W0 P
        }
& I7 v+ P# A# j5 T8 j, w        else
/ J: ?, ~+ k9 J* b  r2 g        {
' q* p. l8 r& d, h5 N% w/ L                printf("No effective message!\n");
3 H- f& m/ R/ k# I, m        }
( i% ]0 v7 C" Z5 M5 ^* X1 h}1 R2 \. g% O; T) m/ Z. }$ [

  b: D4 [, M( a5 H8 P" j没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???1 z0 P# p* O8 m$ K$ T$ ]

* g8 {! }. l0 v) V. I3 t1 G
$ d. r5 @) N6 ~: {( x9 {& o$ A! _3 P3 p8 j9 g0 b; y7 B

9 D4 E7 G" k7 j- M( N) Z' M+ ]) k5 s7 R




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