嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 6 w) X+ b  L2 g" P' |; D) |
2 f" F& z# Z, _) k
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>* C9 H  g* [  d/ L
#include <unistd.h>3 R+ B5 i# I- k
#include <sys/mman.h>
9 c. x; ]# J; t5 |- L#include <sys/types.h>. f  [! l& Z0 H) r
#include <fcntl.h>
! D* S5 S3 u. d- V0 D1 D
5 e$ C6 C, X' q7 M3 M6 Y#define SHAER_RAM_BASE_ADDR    (0x80000000)   
, P" ]# W- S5 ~# Z) Q& e4 E
) \7 y' m5 u" N# ^- p) stypedef struct" z# i7 ?0 h2 I& M. n8 J: b/ @  E
{
" y% Q! N1 N/ S" W  u3 U        unsigned int a;, L1 b7 t& X  E- l6 ~' x% j
        unsigned int b;
/ @' [* l1 E! L/ |3 x        unsigned int packet_cout;  _5 N% l5 `( T# R* a9 r: x
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
! E1 `3 O. U; w3 z. f) b) J/ |6 ]3 w% [& O) ~
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);1 B% N8 {5 x0 \
unsigned int count_copy = 0;6 K; F1 [9 e9 [2 W% C

" E0 g  P6 e8 Q& Q- X7 U7 ]7 g6 T- d: @3 c! f! L3 c
int main()$ m/ X* m5 `. j% V$ I
{
  O( V9 a+ z7 q9 b        pRX_MSG_PROTOCOL pshreRAM = NULL;
  N% S' k' k! p5 _1 l1 E; c& ~        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;1 K) n, g- \; S3 ]1 P6 |; {

& X; K' Y( S' i9 J& U+ j$ P: Y        while(1)5 \1 p9 j- S# v$ F
        {+ r9 _2 Z% z  ?6 r
                read_MSG_buffer(pshreRAM);+ s3 [+ n, k$ b- I& K5 Q
        }                ; c5 |0 F* ?% W# z9 y
}7 J2 y$ j! l# p, e( M" R" H
- C( F9 J& L( ^5 g" W2 w4 k$ H
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM); s& `* d* D9 r6 o; s% b: |
{( U9 t+ R; P0 E3 {: ?4 Q
        RX_MSG_PROTOCOL buf;
* x  t# L9 \# ~        
3 C5 e: s/ s5 W* Y( S        buf.a = pshreRAM->a;
) t) I, f) j+ }8 Z6 h        buf.b = pshreRAM->b;
  r- D) U! t3 K- ?0 J$ B        buf.packet_cout = pshreRAM->packet_cout;
$ Z% |9 t5 @# I, b  y" }5 B# ^        , `6 p( x' M2 M! O. K  ]
        if(buf.packet_cout != count_copy)
$ ~' y6 c& `" T+ ]! I        {. M: X  {" a. u: [
                printf("a is %d\n", buf.a);+ Z0 [* ]  Q6 w2 M0 \
                printf("b is %d\n", buf.b);
% [2 O7 d& Z; m8 j2 e! Z                printf("count is %d\n", buf.packet_cout);
. F  M9 t5 Q3 W8 o$ _! D, _                count_copy = buf.packet_cout;5 w8 _* H4 v9 t. Z* A9 j
        }
& {+ j: D- d7 j        else5 Z; u) y5 M1 R5 E' X% v
        {
: U  m9 t7 T+ z; O  K9 k                printf("No effective message!");
' s" F% }$ d& l3 N        }
) C! X7 h* e) f* @}( u7 f8 [  `) `( J2 ]; i' Z7 U
; q3 J. ^( Y( {6 m! x- N/ @
6 c* v+ w) j5 a9 u: x. X! V
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。! H7 v4 k, m& g' L
使用下面代码,对内存使用了mmap函数后:; W5 S- B* N6 l; k6 H" _. t) p
#include <stdio.h>5 }) y- r# r* S, J6 D: }
#include <unistd.h>
; F9 o0 l+ M& z  Z#include <sys/mman.h>+ y7 A  P/ Q) |6 E" v* c2 i/ s
#include <sys/types.h>/ l0 y" I0 S8 c
#include <fcntl.h>
0 s: @5 F2 {9 a9 ^6 `& a: d
2 p; D( R$ S& k7 }3 z#define SHAER_RAM_BASE_ADDR    (0x80000000)* J0 d  F$ o6 W) v
#define SHAER_RAM_SIZE         (0x20000)   
3 a& I/ j8 m1 @9 W+ V
. G: ^. L  b& [5 xtypedef struct% Q6 h. j2 s  y, T# i
{3 m5 G8 m# M) p( }
        unsigned int a;. H9 c" P, {6 G! |/ J% q
        unsigned int b;  g6 m9 B' `7 I/ F( g1 x; m
        unsigned int packet_cout;
. w+ z. s6 V% [; ~; u6 K: d/ p}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: y" I( X. Q7 @2 c( g5 ?  S& l/ ^' s$ P  l
void read_MSG_buffer(int *baseaddr);$ t6 x2 o7 n& x" S" o- }
unsigned int count_copy = 0;
, l% Q$ ~2 o7 Z3 V6 P% l: n1 @) H$ f0 g; h1 M
int main(). h' z, e' y. S
{
1 U6 e$ r" M: `3 i. W        int fd;
, S7 x. T. ^; u8 `& P        int *mem = NULL;" F- H' z- `- W# Q

1 i) t# {0 s3 k( ~: D8 L        if((fd = open("/dev/mem", O_RDWR)) <0)1 o% N1 A* R4 E7 `
        {' y& g3 w' h2 K
                perror("open error");; i: `, [. }8 L) i" s
                return -1;: T- `. i* o# b+ c0 p( d- z! M
        }9 e2 \' K$ ~* {: n2 M
        
2 Z, s% e, z4 ~        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);3 d7 z* r3 R( N! B, D
& `0 X6 [, B: D. e- ^# U
        while(1)" }! E, F) O: R7 v9 W
        {! ^, F' E1 a6 A2 X
                read_MSG_buffer(mem);* \. x. B7 W, ]. F: |
        }                % Q( q& K# t* G6 C0 h; \
}' ?6 b1 b" P" M3 c  y

: v9 T: t0 u/ d4 m- dvoid read_MSG_buffer(int *baseaddr)6 M1 N, M, |1 Y
{
; f- n# [! ^( N/ C5 Y+ I0 M        pRX_MSG_PROTOCOL pshreRAM = NULL;
) S' d( }. f9 Y
+ i* ?8 k0 Z: ]0 ]1 d* n        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
) Y1 U8 b5 F# {- ?. j3 A) `& v' {- M3 K6 l6 D9 c$ [$ P
        if(pshreRAM->packet_cout != count_copy)$ D) o% w# l% f) a% S4 @* V' k7 v
        {
* P8 |: u! L+ s0 V6 H                printf("a is %d\n", pshreRAM->a);
. _4 `, i) i$ E9 O0 x                printf("b is %d\n", pshreRAM->b);
8 O" W$ M( Z+ C0 L" l  y, U                printf("count is %d\n", pshreRAM->packet_cout);2 Y% l1 Y( y% E0 V" u4 m
                count_copy = pshreRAM->packet_cout;
% C* C3 M; c3 }- u# `- W        }
4 `5 d6 o& f- ]        else
, O# T0 Z2 \3 l5 s        {7 Q0 }  J$ X; v* A3 F
                printf("No effective message!\n");
8 z# E0 V0 O  L, T2 |5 ]0 x& y+ u& d8 k        }% o( S9 P9 Q( m' J
}: ]7 }' e: }7 D9 j, h& j
) A' M5 u1 a+ K! k/ ^4 f& E
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???8 i+ f2 q  w( p5 B8 B
# q' O) {  h& I( N- ^' a! G

; P& J+ m, A& W/ _; v) k1 Y) b/ C/ X4 I1 t( B
& ~8 x' K9 s, _





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