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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ( ~5 r5 n1 M- V  f6 v9 c
8 g9 e5 j  c" a" c0 g  u/ R
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>. c0 Y+ }  C5 j: n5 P
#include <unistd.h>
7 f' z0 h' ^* R) V9 K#include <sys/mman.h>
* j5 p" {2 {" W#include <sys/types.h>
- L: Y. B% [1 J! j1 H0 o& t2 [$ F#include <fcntl.h>' g" [1 f& w+ b1 t, A$ R$ `
+ a( L) n# U% \% V, L& U
#define SHAER_RAM_BASE_ADDR    (0x80000000)   " e9 M  G7 Z, i: T

) q( ^$ l7 S5 U9 p1 {typedef struct2 T+ N" o2 K- _9 A0 N, _/ O
{9 m* Y1 n( a+ @7 A2 q6 D7 _
        unsigned int a;# F) ?- _1 a, k$ x3 R+ s
        unsigned int b;
1 b/ J; W; }: c3 Y/ `        unsigned int packet_cout;
( [, j/ d0 d, s# ^1 }3 @}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;* f( f) }5 A) M, ?

" k" t  i. u' q4 d0 S, ?void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
5 C- k1 ]0 T, z, }unsigned int count_copy = 0;0 ?3 v" V+ x' R  W2 e1 l5 @4 u- y; T

* j9 i" u: P/ X: t9 Z
4 z' W9 a( _9 c8 A2 T4 [int main()
) g! X2 x+ i: C; L9 T{, W( m" X+ n3 X8 S- c; b& g
        pRX_MSG_PROTOCOL pshreRAM = NULL;: ]" ^$ [1 E) R( ?6 v* j- k3 ?
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;, S! i% B. ]/ C5 T
1 |% D$ Y. e+ |1 w. w" i, F; j
        while(1)
! h7 O" u" l: d' w! S7 k        {
2 G; M4 u% D7 `2 N                read_MSG_buffer(pshreRAM);
4 f, s: F( }1 e* |+ @* K( i  B        }                ' n; F/ ]0 O) [, ~
}
, h# a( X4 m7 Y+ v: c* o% d3 L
. v4 \# Y0 h) d& Pvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
, K* G3 R. p0 @) f$ s{
+ K  B$ d5 ]" {! J1 E( q3 t$ ^0 c        RX_MSG_PROTOCOL buf;. k9 Q3 x0 B' ]$ x7 `  X" B% v
        
* N) W2 V5 h  @- ^: |$ c        buf.a = pshreRAM->a;* V; T7 S' \! n# x0 W8 e+ f( j; w
        buf.b = pshreRAM->b;1 F/ B) X+ R' L" y+ Q0 P
        buf.packet_cout = pshreRAM->packet_cout;5 T2 u& g9 i) @% K- S/ }
        
3 y- U/ r6 T" `: a        if(buf.packet_cout != count_copy)
. U0 c8 [' `/ S1 n5 O7 u        {
3 Q# P+ w8 y0 b9 s                printf("a is %d\n", buf.a);! Z: x8 ~: J1 G" p$ A
                printf("b is %d\n", buf.b);0 T# P  v2 M+ p7 D: e- j
                printf("count is %d\n", buf.packet_cout);
. a! g: W. ]2 X; |9 o5 ~2 A: E/ J                count_copy = buf.packet_cout;- E8 D" W0 U, t5 N
        }5 t" P+ A( L6 D2 t1 n
        else1 A6 G, c4 o% k
        {
; G  X$ _6 A5 l) `7 n                printf("No effective message!");. v. ^0 x; _1 X& x# Z
        }# R  H& o" Y- n; X  \
}
- t4 ]4 z) s$ _( r. o# a+ `/ B7 i' k' f/ D2 @/ I, T' ^

" S2 U/ [6 H% p) B1 z% u但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
! w* @" v; n& [  J" g使用下面代码,对内存使用了mmap函数后:
4 b2 u% `( p+ U! W6 M#include <stdio.h>6 \1 D8 M/ g' O8 A$ g: g  t
#include <unistd.h>
) y6 Q1 ^% X* K" _3 E$ k( u- X( [& M#include <sys/mman.h>
  p+ N6 [& F- x8 Q- ]+ \#include <sys/types.h>
6 o+ n& o) e$ \) ?0 {, z$ J#include <fcntl.h>
5 G  @- G) m; Z2 [  `' Q$ m1 ?' q0 o8 ?5 [3 H
#define SHAER_RAM_BASE_ADDR    (0x80000000)* @6 ^1 V0 L8 J8 x2 Y; L; L
#define SHAER_RAM_SIZE         (0x20000)   # J4 T2 h5 d# m; I7 Z

; O- ?  ]' H8 otypedef struct
( Z6 b3 L( |  m{
+ b) h5 L" E$ q, H$ r+ F: Q$ h/ D        unsigned int a;  C3 y0 e+ q  L& n. g' _
        unsigned int b;# ]0 I3 r9 \$ z5 H- n! Q/ }/ f& B. {2 G
        unsigned int packet_cout;
- Z2 _7 Y/ I; {+ w/ j}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ T! r' J! m5 e0 Q' o4 H8 d; `9 Y" b# m
void read_MSG_buffer(int *baseaddr);/ x5 [, C6 X, H$ q: }, n
unsigned int count_copy = 0;
7 z7 F) x' n1 `# e( x, O; m$ k8 @6 T1 I. |1 Q* [
int main()" n8 J% R/ ?. q. ]; N7 b
{
( V+ U' o7 D# w0 A  N        int fd;
& k6 c3 p" H- m0 a        int *mem = NULL;4 h8 b  s( b. Z# U3 K  ]# X' \
, k( h5 ]; o$ i2 x0 `& x' x5 y
        if((fd = open("/dev/mem", O_RDWR)) <0)
$ J' a% u! F: j+ x        {
+ x. {' g/ W9 L0 c9 x5 \* C                perror("open error");
* v# p" S2 F1 i; a8 ?# E                return -1;
/ I9 R" t5 _7 K9 W/ r        }( i; p* s% W, ]; W4 m5 M
        3 _+ a$ l1 ?- |+ C
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ v7 O* v3 b% `# ?1 y5 A8 t5 X. }$ K4 ?. e0 F
        while(1). x% r6 q3 {: x1 Z2 |
        {
8 b6 A4 C6 d6 H( l' q                read_MSG_buffer(mem);$ o9 F# @6 d% p. ]& Z' k; A
        }                ( A: G+ g. {: [4 x1 h
}
/ l+ p- c) W1 ^! y
6 v( C: v4 G8 w! z7 Xvoid read_MSG_buffer(int *baseaddr)
* _  I2 S% ]$ t  u4 b* A# o4 m{3 \& U) C3 o4 t4 d2 e& `4 Q" r" u
        pRX_MSG_PROTOCOL pshreRAM = NULL;
+ b& x( @9 f8 S) k2 q8 f# v, \4 r1 L' s8 m: r7 w
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
$ W5 }3 S3 L0 }6 G
5 u+ T- m4 o3 W4 A) v; X1 @, S        if(pshreRAM->packet_cout != count_copy)
6 g7 O8 P- H. d& E6 H; u8 r8 ]3 e        {' F2 [6 X+ J1 f9 A8 X" M1 j
                printf("a is %d\n", pshreRAM->a);
9 F. |7 i* t  }                printf("b is %d\n", pshreRAM->b);: ^( [2 e% Z) v; n- _
                printf("count is %d\n", pshreRAM->packet_cout);
5 [; f. d$ X, A. Q                count_copy = pshreRAM->packet_cout;
2 F5 {$ Y. c' U. B0 J        }, u) l' {6 F1 ?; e: x& m
        else. Y5 v' |& ^- n% t' J: n
        {. w! [9 x& ^5 R/ ?! f
                printf("No effective message!\n");$ g/ z: L3 [( o! [) S
        }
( a- m( K3 f, u$ n9 u+ N}
/ X& S4 y- a$ Z/ M7 E
. V4 \" H+ A2 F) _1 e没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???1 [9 i1 M, {& r' y2 R7 v1 y
/ T1 s6 a9 M% F+ H
1 x, q) g: r+ y7 s4 n

  L" O$ k: x. e9 g- O! C2 i6 I- h) f# q
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-27 20:29 , Processed in 0.048256 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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