OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5184|回复: 0
打印 上一主题 下一主题

OMAPL138的内存映射是否在Linux下已经完成???

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
: z2 k6 h/ |& p, `2 O- V$ L8 C0 B
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
& b7 I2 s5 w( [1 Q#include <unistd.h>6 k0 R8 K5 y) L  r$ ~
#include <sys/mman.h>$ \5 U6 N- V/ G7 `4 h/ _" z
#include <sys/types.h>
" M  Z* ], T' ^, I; ]#include <fcntl.h>
# ?5 a5 R- p6 q- X
9 v0 W+ z( u) r& W2 F' x#define SHAER_RAM_BASE_ADDR    (0x80000000)   & u' T8 T7 n. b$ m/ U. Y  [$ Z# j. E; t- g
/ ?' T9 {, r. C4 m1 [
typedef struct
5 |4 n+ F3 J1 S* Z% L# r{
9 i% ^# N( F, h4 A        unsigned int a;: z5 X8 A0 R6 ?4 n' q  [6 z
        unsigned int b;% ~3 ~% B2 t0 |7 i0 w1 ?
        unsigned int packet_cout;
! B4 U3 \; m4 O6 A- e) G, e}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
  s; C& ~( L1 q- ]6 b. x9 P3 G: w: P' x+ V" k# L
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
9 t! r+ u6 }( |3 Y- O3 p7 G# zunsigned int count_copy = 0;
5 {# @9 Q! O: D: i& @
4 K: H4 d* Y% f: I! s: n3 f! [0 f, n' `
int main()
) G3 S+ u8 S) y( T9 |0 a" c{) |* T9 D. l) S) x3 W
        pRX_MSG_PROTOCOL pshreRAM = NULL;
5 q# x! R" X% V/ g% p& w6 e        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;! t1 K+ M/ B9 p  d

" d8 m2 g9 S1 ~" ?. `        while(1)
3 R8 @. w# V% I- R  V1 C        {
7 y* e8 G/ c7 k! t0 J                read_MSG_buffer(pshreRAM);. c6 W  o4 Y- h
        }               
+ f# h- q9 P* N# h1 ?0 O- p; e3 r}
6 }4 ~7 y7 d4 J  e. t; G, z6 E% G; v8 P5 \0 l4 n& ?
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
5 m: K* B2 H. z1 A+ X{
4 L% v; R8 j. J* Q& j( N7 W        RX_MSG_PROTOCOL buf;
' F/ x' G; w/ @' l9 R2 W        . W7 f4 z2 g! s: a. D) f
        buf.a = pshreRAM->a;/ g- U6 f8 R; q0 Z0 |; H: b
        buf.b = pshreRAM->b;
2 _9 d$ X! w6 _; F* j4 N        buf.packet_cout = pshreRAM->packet_cout;8 a2 J) {* M. U2 t' b3 Z+ i
        
9 l8 C. h, E  ^+ m0 p6 g3 |        if(buf.packet_cout != count_copy)
5 \- n) ^7 @5 l: l        {) A+ t; H8 D6 b0 p
                printf("a is %d\n", buf.a);
: b6 o9 ~# a; l2 V                printf("b is %d\n", buf.b);) |; x/ k- [+ `' m" j' `
                printf("count is %d\n", buf.packet_cout);
$ I& k( H' V7 B7 x9 {. ^2 q: i" t                count_copy = buf.packet_cout;* \- e) `- B3 o$ ?3 {. q) s
        }
( N1 m7 N& i* E' |6 `; [        else
$ i- q# f* c6 s: A- j% A        {
1 U' {! p2 @( w6 I0 F3 Y                printf("No effective message!");
1 G. k! S5 ]( `7 U/ {! F- C$ `        }" ~. u9 C' s5 K! N- E
}
2 o* W6 b" c* |) s* _3 t' g
0 p# v" K8 V' p
8 d0 D, n2 }/ g. y/ I但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
  e) F. J0 _: w# _# @+ m4 P( W使用下面代码,对内存使用了mmap函数后:% t1 T: Q, n9 y" U! i7 Z
#include <stdio.h>8 z+ \9 M: q' f+ c
#include <unistd.h>
, W0 ?0 w, d: \#include <sys/mman.h>
8 }/ i; J5 h9 _2 C% V3 ]#include <sys/types.h>
) T5 m0 z' j' @- e* ]  A#include <fcntl.h>/ M5 Q4 q% q) V/ a: ^
, i4 u4 F: t. O4 Z; z+ g, t
#define SHAER_RAM_BASE_ADDR    (0x80000000)8 }3 Y4 F4 Q& A/ X) Z7 f1 @: }
#define SHAER_RAM_SIZE         (0x20000)   2 |6 U3 x! t6 {) N/ G+ y7 C
; q+ k5 H9 D. |/ ^1 d
typedef struct
7 i1 B2 e1 [2 t0 @- L{
( a& y2 `1 O$ f. a        unsigned int a;
5 H0 L* m8 D8 E        unsigned int b;) n" C; U/ ]/ `' @2 F
        unsigned int packet_cout;
( m* n0 u9 m5 W1 d}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 {: m& D8 E, F+ C1 C( }5 M
! s7 T" W& M, U; E. _# r1 k7 h. rvoid read_MSG_buffer(int *baseaddr);
8 d2 D* y# Y6 d* [6 K& nunsigned int count_copy = 0;
- T# W. i/ H4 Y  |, E. ^5 I
7 g- D+ l# p, p/ S7 Qint main()
8 Y6 v! W  H' G% p# r" O{+ v8 s3 S6 c5 L* }
        int fd;/ q) |* g8 y! M- O+ I* I; e( k/ x4 ?
        int *mem = NULL;
5 E' }: e. v1 N. z9 B4 C
/ n0 ~( S: c/ j1 F4 ^4 j. Y        if((fd = open("/dev/mem", O_RDWR)) <0)
  Y- _, r; d8 k6 f        {
0 g/ I. T* g3 k1 Y* \9 G9 C: W                perror("open error");
/ M" A) N: Z- G- r8 k+ l                return -1;' I& j2 p! R# i7 `+ k1 Z
        }
) G: ]* G$ m5 g( r" l7 G        
' l3 m6 P0 g6 h        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);' x' V; H$ B$ [) r
* h  ], @- \8 H6 F+ }; b. H$ |, x( F% B
        while(1)! |$ O" Y0 Y+ r2 A8 {' p8 @
        {: }& d! M; V# o6 b! A. n  ]
                read_MSG_buffer(mem);6 I8 R& k2 b7 M/ e$ c' h
        }               
$ O( j% i. o8 {$ r}$ }5 _! p& f% P: b& U3 L8 d4 n* K

$ P# ~" R: g% G- C' W- `void read_MSG_buffer(int *baseaddr)
, Q, E$ v$ m4 f2 \% [4 Y' [0 c{
" F; V( O8 f2 d; z/ e/ D        pRX_MSG_PROTOCOL pshreRAM = NULL;- U# |5 p! {$ l% I, U

- G. _5 W# T) H! O; d        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
1 s) v. y8 p, x  i3 o
! h3 f  J$ z: s0 u        if(pshreRAM->packet_cout != count_copy)9 Q5 t! _) N+ c' \# E% @
        {* l4 O$ c& d! c# C
                printf("a is %d\n", pshreRAM->a);
/ Z* k* [; K& Y1 F4 z7 g8 c  |: G' G                printf("b is %d\n", pshreRAM->b);
" Z2 e  H0 f* a! o% V                printf("count is %d\n", pshreRAM->packet_cout);
, h  E+ W) {" ~) @                count_copy = pshreRAM->packet_cout;1 c% m& ]; L1 X; z& \
        }
1 G, K, A& p1 a- [$ {        else0 o4 |7 `  F# |4 Q& }! o# ~
        {5 T' A( c% h3 @. [9 |
                printf("No effective message!\n");
" G2 A6 ]# U9 y- y' {8 v; t        }
7 V$ p- i. @% [( k}
# V. A. v( u' v& O! y
& g) q2 x0 `6 ?& f" @# W& b, d7 f没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
" t% w  s! P! l/ s: @5 K. ]) M4 A8 c/ ]4 ?& i/ F* Q* ^+ p, P

, R8 k& g- V+ ]( _
. l6 e2 Q% E. }# a0 q' P0 z
  u/ X. H; ]' H
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2025-11-26 01:00 , Processed in 0.038631 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表