嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 3 x  V  {3 g1 E; u" N& R

6 @0 _! {3 j! _. z' eOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>9 r6 |6 A1 P' ~, \* q
#include <unistd.h>
. z% V: F$ _, e4 k0 X( G7 n#include <sys/mman.h>/ Z1 k0 o- u. N
#include <sys/types.h>
* U" }; \/ d  @#include <fcntl.h>
% `1 q# S* d) F, d/ Z$ Y2 M2 i2 p- ]' |/ }& c
#define SHAER_RAM_BASE_ADDR    (0x80000000)   * [9 ^# T0 C3 z
8 d0 q+ t, W) B- r" `+ @% A/ p
typedef struct8 o1 N" y( N. a# S3 E/ M
{% H, H" I1 `/ n$ U
        unsigned int a;# z- C$ r" h2 T5 ]( a' q
        unsigned int b;
- }( R  Q  G% c( K# ]+ c& s        unsigned int packet_cout;
0 p' |& C6 f2 S8 ?) d* f5 B! m}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 H" |3 a1 W* W7 j# l* t( ^, `- n& j- f# w
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);. u9 R. ^9 H$ v3 W8 m
unsigned int count_copy = 0;
5 F* B. e5 ]  |; V' J! F5 X: U7 Q
% G, h6 ^) ]7 h) f  H/ A( N& D( `
int main()! r  Q1 a$ F$ F0 @; ]+ C' ~+ \9 F
{0 n, _5 Y  B- ~/ ^+ @6 b2 {
        pRX_MSG_PROTOCOL pshreRAM = NULL;
* O# B* k6 i( h) D/ m# G* E' v" @5 U        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;$ e* I/ z, V; ^& z1 ]9 {% ?

' p6 k2 m* a+ p  l8 |/ s+ n        while(1)
8 r5 g' {" g7 w3 H! D* E4 L        {
% z/ z8 o+ V% l1 @                read_MSG_buffer(pshreRAM);
5 `+ Y6 G6 C0 W3 s5 z) x$ w        }                . Q, U8 O4 C8 K* m" n' r
}9 ^* r: |9 J% A* m
; h% v# p' r+ w( s+ N
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)" Y( {8 Z1 X1 v, k* G' K
{4 e# ~" ~$ S! n7 }: A3 G+ j- p9 T
        RX_MSG_PROTOCOL buf;
/ U# z+ E: i) U0 g" ]& [8 P0 j        
/ D, C/ K6 {" \3 k2 x4 a% h* q7 F        buf.a = pshreRAM->a;8 J) U' n0 n+ t  U5 L" \; J% O; m, a; l
        buf.b = pshreRAM->b;8 k0 Z. }( c+ m6 H3 Y* H# Z0 ^
        buf.packet_cout = pshreRAM->packet_cout;
; c' l6 b  N7 u0 ?4 J& k  f        " b. ]3 P9 U7 d9 q! |5 ~8 m8 F! @: Z& X
        if(buf.packet_cout != count_copy)8 u) @' G$ K* B1 z% N  Q# x
        {' T! M' Y, q: h' R" q
                printf("a is %d\n", buf.a);! a$ D  M+ p8 x! O# L# D# ]2 \
                printf("b is %d\n", buf.b);
$ I  t, s0 @; C) y4 D) B2 ?                printf("count is %d\n", buf.packet_cout);$ C2 |9 H, z$ i7 Q6 V, h2 _. L
                count_copy = buf.packet_cout;0 m7 S. P& u! ?! a3 l
        }# e! {! |9 q+ g" Q6 F' y  f
        else( s; Z4 j1 p! z5 _2 s( G
        {
, u4 M/ g" q0 B+ Q+ x* L                printf("No effective message!");
- j% N0 k6 ~9 M0 M/ ^3 T$ G        }: {8 [# H- k+ L( z. @- B
}) W& T0 p; f0 j4 V
. ?* z, r! e$ E- P7 ]4 R! C$ P

3 J4 A' y1 w& V5 s3 S但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
% ?- k6 v) P- V( j: |  ^2 G使用下面代码,对内存使用了mmap函数后:9 U3 F) O' w. R6 Q2 D- U$ y
#include <stdio.h>
% f( z* B& d) y#include <unistd.h>
/ B5 r+ Y: x6 c. w, [#include <sys/mman.h>
& T! a2 A- {/ d#include <sys/types.h>
! p! a/ m' w- J#include <fcntl.h>
4 v9 t5 q) b- k: d
8 X6 i" S; \# i3 p$ ^2 ?( _#define SHAER_RAM_BASE_ADDR    (0x80000000)
! K5 [- z1 g% B. d- z1 t- |9 [#define SHAER_RAM_SIZE         (0x20000)   
4 e0 |! x, Y1 j  {- ^- ~6 e  S; |: A3 _- l% a8 d# N8 Q; f
typedef struct
/ w8 H1 m, T+ T{
3 Z& [/ |# e, ?4 ]1 y9 O        unsigned int a;/ I& ~. C3 a# x! W
        unsigned int b;( p7 ^( R' ~% ~
        unsigned int packet_cout;
# y; s) b4 i. ?! ]' i# q}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. I! U. d# i. x% d- j2 {" g

( ?& Y9 b8 h5 }" H% Hvoid read_MSG_buffer(int *baseaddr);5 n; l1 O; X. T+ A
unsigned int count_copy = 0;
: C; {5 i! p8 X6 n' V% r/ Z9 }0 O
int main()
- ]8 t% n: t8 j# v  M3 K{1 S  M4 [$ d  L9 @/ d& \( M2 J
        int fd;+ F# z- `' k2 t# k; i
        int *mem = NULL;, E+ R- ~6 L: z: Y5 n9 B

. ~* [6 n, H  {* s) s7 m        if((fd = open("/dev/mem", O_RDWR)) <0)
  ^! u2 p+ x, H% M% Q8 k3 z" X        {0 ]/ a( ~, N0 `4 O, @6 V
                perror("open error");9 v( m) n$ y6 E( o: E
                return -1;
, P) w8 H3 P) e: }" p% C8 B3 `2 O        }
0 W$ I1 }4 E' r( _        ' @2 J+ m  r1 X9 b9 `. h8 u5 Q1 @
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
& n2 y9 ?2 Q) C6 H" K# I& k6 j* @' n( k3 D  O
        while(1)
5 L2 p, J6 w9 Q8 O8 @        {
: Q) @: [% V6 ^/ ]                read_MSG_buffer(mem);* \" @+ h: ?4 ^) j0 o! \. t! R
        }               
& U/ w+ R  o5 t# k2 r& c9 ?# I2 l}
% q' S# a& j6 t
6 Q) }% H9 K$ F/ `6 G. E5 D5 t# Lvoid read_MSG_buffer(int *baseaddr)
5 y! k' Q& `, n5 W1 F" O# n7 _4 c{. R2 i- K4 I* }/ M
        pRX_MSG_PROTOCOL pshreRAM = NULL;% G7 P& Q+ K) `$ \, L% G
4 M1 I- Q. e+ r: L) U: ~8 o
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;! ]! Y4 Z* b. g# E. x4 ^1 L

6 J3 F9 y8 G, d. N! d        if(pshreRAM->packet_cout != count_copy)3 L  w3 y# j% ?2 a5 K% `
        {* c; n5 c! g) ]+ Q. i
                printf("a is %d\n", pshreRAM->a);! k7 w2 d9 L8 i) x1 x
                printf("b is %d\n", pshreRAM->b);* ^( ]" m" s, V( P. ^
                printf("count is %d\n", pshreRAM->packet_cout);
, |8 v% |9 G: f5 K                count_copy = pshreRAM->packet_cout;
; {# E1 F$ v4 B6 j3 x0 a        }
2 ~3 S, X/ f' K1 ]* o3 u8 g        else
0 w$ F2 _( p" K! L8 n        {. _5 {( F+ t6 c4 g
                printf("No effective message!\n");
( @& e- f8 E/ q        }2 X( s& Q: d( i; X- _- z
}
) Y) U( H  H0 I% E
# d5 V* r; J$ ^6 T. O/ p没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
( [, Y" X7 `, x; h* t8 {* V. r0 b2 U7 j6 U6 y- X
4 e6 G5 q/ {% F
, \/ a: ~0 e& ^9 M! k

5 e2 v! k* Z& g. r  V9 x6 Z8 v% u




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