嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 & H( B7 I! l# u$ ?6 n9 x

/ M( {0 y0 W3 k9 F5 DOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
* ]& ^0 T; e+ P0 d#include <unistd.h>) g+ J/ _$ P+ O
#include <sys/mman.h>
" j! i2 X- q8 |9 a#include <sys/types.h>
) B7 E, h5 J7 w#include <fcntl.h>7 T2 J/ V$ R) f/ Y4 b! O1 C# Z/ u

6 {2 R/ U9 \, t#define SHAER_RAM_BASE_ADDR    (0x80000000)   
3 A" Y+ y* _- J, w: ]! W9 n7 B. e/ [, w
typedef struct
1 L" H: k7 Z* x' r& y{
; }7 K$ @5 I. S+ B- R8 M        unsigned int a;; i' d* _1 p# q5 b' O6 D: ]
        unsigned int b;
5 P. f" Z1 K: t1 b' |        unsigned int packet_cout;
+ _- n* t6 n2 r}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;1 W4 ~; ?6 B% l5 R
4 k9 F$ f( R" ^8 M. ~& C9 b" m
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);- e: e9 K# q1 @" @/ U' M, V9 r
unsigned int count_copy = 0;7 f( u! A) |. f5 `
: y( }( J) F; a7 M1 l+ c; a7 R
3 U1 i3 e7 |! I$ z" n+ Z1 [
int main()+ S6 d* ^) W( ~5 v+ ^3 U0 f6 T
{( n* l. `/ r  j! i5 K; }
        pRX_MSG_PROTOCOL pshreRAM = NULL;- B( B* E4 T- H; C
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;. m! k4 K3 ^% P8 l/ L

7 `0 a1 z) e( L0 `. c        while(1): O" H! D4 |1 ^, w
        {3 `7 z$ x2 y7 B& O: |
                read_MSG_buffer(pshreRAM);
- m: n( M3 g6 [9 c+ i% q        }                + q3 I  \$ s+ I5 ]# j! l9 r
}$ j0 w; e. u5 ~9 R2 ]

  \* k4 Q  S9 Wvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
( [0 L3 M  G" Y( x+ ?/ F; f& ~4 ]{
) E3 U0 f; s& n1 `6 n! M( Q        RX_MSG_PROTOCOL buf;
9 ^' H  X2 j* _) r) ?5 ?. R        
- J1 d( `5 m2 ^9 A7 L$ \6 C        buf.a = pshreRAM->a;
) h3 B. b" L3 q* J" m        buf.b = pshreRAM->b;3 e& y& q, F- N: i# J) `/ M$ ~: \
        buf.packet_cout = pshreRAM->packet_cout;
) T- z5 i% t8 r1 I( _4 K$ A) s        
+ g5 F5 p$ b1 _! A" A$ i        if(buf.packet_cout != count_copy)3 G2 ?5 {4 p5 V( S- ]
        {
1 `  _- {. H' R' T                printf("a is %d\n", buf.a);4 F  [' }8 g- M6 v& _  c5 K
                printf("b is %d\n", buf.b);
0 |8 v' O  L9 V                printf("count is %d\n", buf.packet_cout);
. T" }6 b. \8 Y3 U                count_copy = buf.packet_cout;
! \# H8 D* A  Z! D" U. o        }- f5 l8 b# Z4 w1 J; a$ x% O( T
        else
4 D5 J3 Q! e1 U5 V9 }; J        {
/ \6 {- U0 O+ b- o2 e3 ?                printf("No effective message!");
- V4 x8 l: \4 z1 R8 q7 ~1 k        }
; @6 X8 j. l" v) w}" B. N4 m% a) I
  U9 L: B5 R6 T" F% ~; n2 s& t1 j
/ A( |, S/ j9 w) z! ]" [, T- S
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
9 Z0 S6 h( v' t. [  c) \使用下面代码,对内存使用了mmap函数后:
/ M& c# v0 G4 k! Z4 f- A0 P8 e#include <stdio.h>6 r3 N5 j6 g8 }) c1 W) G
#include <unistd.h>
9 @2 U$ C2 n9 Q/ z5 p+ E#include <sys/mman.h>' r! l' M( S9 r/ N: ]
#include <sys/types.h>
/ D  H3 g* `' G3 h3 b#include <fcntl.h>
0 B' L0 F% @; H3 M' [
" Y$ ~" u3 Y& K#define SHAER_RAM_BASE_ADDR    (0x80000000), F( O% c4 T# b, C2 l5 k9 F
#define SHAER_RAM_SIZE         (0x20000)   
7 E9 F% Q1 B* w0 W8 P
. T  W9 l/ {8 I( f; |6 g" ntypedef struct, G1 a) N2 P: y, w) g
{: l3 M8 n0 u  Q- n. ?- u! [
        unsigned int a;3 g, J% o5 F5 v0 H$ ]
        unsigned int b;& f9 a3 n5 \, e$ U
        unsigned int packet_cout;7 C0 @/ S' j  W0 B
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 I- J4 {7 l- S7 N( E' I! d8 a" O0 Q/ D
void read_MSG_buffer(int *baseaddr);/ {# r/ L' w5 v0 P- c
unsigned int count_copy = 0;* Y7 l3 C- _6 |$ E/ {6 \" i8 x
7 G: K1 R3 _6 ?) _
int main()
& ^! j7 J! q1 V" A{
$ Q- w- V4 m- g' v: g        int fd;& I" L5 u! K2 e# f
        int *mem = NULL;
1 w, ~( _7 P+ o, o8 A; q9 ~% k: d
        if((fd = open("/dev/mem", O_RDWR)) <0)- N/ v$ g9 o" V/ _. N5 t
        {
4 s: y$ m# n' m                perror("open error");
- Z( u: a: g* e( H( E2 ]" J                return -1;
+ N* V$ {: A8 K. |- O! |        }
: {9 u( E& y' F. |        
* u) o. e( R, J  E        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
: x8 o! J9 D$ X. d! ?. Q" N' g5 H' U* c9 w  y
        while(1)
! N4 t# {. f2 @, d        {
- U, \/ T* b2 I' V0 v                read_MSG_buffer(mem);
' m8 ^* [2 g" e; v3 O        }               
# n; L3 ^! G% L; _# p; ^$ B. q}
/ S/ w* Z" W2 d# K, ?) S4 B! ^" X4 M6 N- r, H$ ^
void read_MSG_buffer(int *baseaddr)
7 K" D3 ^6 }0 D{
" ?9 M4 d2 E. t2 u9 |        pRX_MSG_PROTOCOL pshreRAM = NULL;
  ^8 l0 h) l$ |
. U0 T. |8 C- Q9 y* K        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;9 t# Y- `" U) ]7 g
+ D" r( m$ }5 n, n/ h
        if(pshreRAM->packet_cout != count_copy)
+ P* U" l) t! ?        {
( I2 F* @- c+ A+ B                printf("a is %d\n", pshreRAM->a);
$ l/ h8 \% B8 ?( L/ p& J+ c                printf("b is %d\n", pshreRAM->b);
' e8 g; e: ?/ Z& }, ?                printf("count is %d\n", pshreRAM->packet_cout);1 L- q2 O7 I, c2 k% [! m
                count_copy = pshreRAM->packet_cout;8 Q! X# }( P6 P* s
        }+ D# f. z! e7 Q
        else
. }0 O# P1 H4 T        {
( Y+ g% K. }4 o                printf("No effective message!\n");8 a# v( {! {9 S4 ?5 X$ {$ x
        }
# K9 n- {* m; A2 s! [- S  t- ]9 T}2 j; S$ ?# S8 s7 @- ?$ ?& {

/ X6 W6 V& c1 g5 _- g5 `! a没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???/ H3 V& w+ s! Z% V' C, \" j% t

% c+ m3 k, j* d# [
  c! k  R1 ^( k2 L0 O4 H+ K& a& c8 y6 ^4 ]; c
" q/ ]0 A' s8 h! f





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