OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 & e( u$ h' G6 H, w! W# N
4 L: u% g$ U, j/ r2 w; t& E% n
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>2 B$ L& [* Q6 ~$ o# W7 A
#include <unistd.h>
4 _  ]. d" g, [; J4 [: B+ b#include <sys/mman.h>
0 B/ n5 \" s2 _/ b: O" |* V  q; K#include <sys/types.h>
* @5 K" x6 L7 a+ Y#include <fcntl.h>8 ^' ~" E7 b+ x
+ k; l3 I# u" A( T4 T* g
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
# C, ]- x9 N! R# \0 M+ V- u4 q6 t) e8 U7 x0 n" k
typedef struct
* o  y5 a7 X1 A1 H{9 p1 _3 Z2 G- ~9 r( u7 J0 h
        unsigned int a;. P( E* g3 g+ y+ S
        unsigned int b;
! F. H3 ]7 b! R* v) c        unsigned int packet_cout;& d+ ~& K) `" u8 T. T
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;, j/ c% U* m. {  a: D+ `2 x' c1 L0 @

+ e6 B( ]+ ]4 k- }void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
: V' q6 J( m% z+ _/ z" K5 Y# P" zunsigned int count_copy = 0;. d+ j* ?. r+ u. Z
4 I0 n# ]9 Q. _6 Y- Y  K

3 M4 T6 K0 l6 g% X& W0 g  Rint main(), ]9 |7 `: v% K1 z/ m5 `! L
{4 @* S4 e! G+ T& D) ?
        pRX_MSG_PROTOCOL pshreRAM = NULL;! {1 L$ `+ s6 L
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;6 o" ^3 c( d. l4 T

, e0 ~- r5 `/ ^  P1 I        while(1)1 r; R1 S/ D( D( I! _. B
        {
' A3 `  h9 u3 N; x9 T4 ^5 u                read_MSG_buffer(pshreRAM);! B3 n3 l* t7 R7 b2 D* \- n
        }                1 f- b! P" h8 a( x( T  Y' n# i
}' M( V3 }% Y, Q& ?4 A
/ v% c( G7 l: l; |/ u' B9 }2 K3 n5 @
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
8 h% V" D$ O, h& _{
( i$ i2 O% `, r' L# t; K        RX_MSG_PROTOCOL buf;" d8 N7 b# o& k; z' N0 v* j
        
, F4 x$ x9 r. d% W        buf.a = pshreRAM->a;
; G! M( ?& O! ^        buf.b = pshreRAM->b;. b/ W9 i* J5 @: G& Z' H
        buf.packet_cout = pshreRAM->packet_cout;0 h- Q8 }4 O( s+ w0 E! {
        
* r! N1 {/ M0 D% o' f        if(buf.packet_cout != count_copy)
0 B& d2 i7 W3 |& F$ F1 O2 h        {
$ V! v8 K# d4 G: H                printf("a is %d\n", buf.a);: W" }# E" t9 O1 R7 c$ @
                printf("b is %d\n", buf.b);& O% z1 x* V7 A# L- x# Y- \# p5 N
                printf("count is %d\n", buf.packet_cout);
1 }* K6 ?/ d* B1 d                count_copy = buf.packet_cout;
$ t# L5 z& U( D, e/ G3 G* J        }
& `5 G& O, O( D/ M- L        else
/ s$ B$ d5 A* \        {
5 l6 _* O9 W2 ^( U: @* i: h, p: E+ @                printf("No effective message!");1 a0 L) y; |; ^
        }+ n: v4 F9 z, Z
}1 y2 j; [' H2 D- ~% T

/ z) M. U# _7 f4 k% E
, W' g* B' i0 U/ \9 U, z- ~! F但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
7 F* S, f" |. o; L2 P2 w使用下面代码,对内存使用了mmap函数后:) Z0 s- a) t2 l& w2 S9 y
#include <stdio.h>
* o1 C2 ^6 _0 ^, e) m8 P#include <unistd.h>
  D, J% N, V7 ^  Z5 W0 h  R0 e% `#include <sys/mman.h>
4 F, J. l4 m1 x#include <sys/types.h>$ H! l% i5 [" e; K% e
#include <fcntl.h>7 u- w- a0 g' {; S& r6 [2 x
* O# o- H% n- _* Q1 w" I
#define SHAER_RAM_BASE_ADDR    (0x80000000)
+ }: l( q( f. R- G$ ?* w#define SHAER_RAM_SIZE         (0x20000)   # {$ m& l; Y7 r3 w% I2 h
+ M, A9 v6 e" v6 i$ C
typedef struct6 f" L2 f  g. B
{
/ |: O) ~: X" I  ]6 X3 @3 I        unsigned int a;
  Z3 ~$ O* `' M* C5 L9 ]2 o        unsigned int b;
& V! f# M+ n0 f" \! a: D        unsigned int packet_cout;
; z/ v/ ]% \7 {5 Z1 o" q$ i: R}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 e) s; {$ j1 Q- X, J
" r7 L' X, I) e2 p# z. rvoid read_MSG_buffer(int *baseaddr);4 o# u+ a- b9 k/ l+ q
unsigned int count_copy = 0;+ `: q* g2 r5 {0 X
7 L' z; k6 H3 Z1 a$ v/ p& _
int main()2 E0 O0 Q) Z0 S5 X" g' I7 ~
{
* o. o$ X2 y) \6 d+ x1 ^* W- \        int fd;/ o1 w* P( y$ R
        int *mem = NULL;& N' j' d: R. B1 f4 b+ p" s

" E$ T; J0 Y$ ~' c# u9 X4 f        if((fd = open("/dev/mem", O_RDWR)) <0)
2 {) O6 k9 o6 I: c- w* c        {
) t5 X2 O1 Z2 f7 ~& ?                perror("open error");' L4 t, F: V0 u; p  L) V8 _- l
                return -1;
$ J% A$ T* H) d* H8 t        }& `" E- U. u  n% O0 w2 Z, k# e- Z
        
# ^1 F% R) J9 J; u8 Y        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
( j5 k  |6 v5 E$ g5 t; K, q
# b& P$ U) F8 U5 `2 `4 W        while(1)6 i& `$ G, c4 t3 x1 X6 u8 ~
        {
- _: o. Q& M6 M) g2 I( T& l5 b+ Z                read_MSG_buffer(mem);
: `, c) L6 [4 \2 W0 _        }                * F9 Q3 g. q% t4 j% ^* G
}) ~& R; d" ~7 P5 d4 U+ }. k
0 _9 u. r# o" m+ ~+ K9 ^% J
void read_MSG_buffer(int *baseaddr)/ o6 n$ O: ]7 V1 u! A  C
{- v- g5 h2 y5 i0 S
        pRX_MSG_PROTOCOL pshreRAM = NULL;& G/ j1 n5 R, A
$ u" E! `% A) }# c
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;4 Q5 u2 T* M7 T5 o3 m
  _& ^) u$ q/ B
        if(pshreRAM->packet_cout != count_copy)8 X! R, |. j* _7 s1 ~. \1 O
        {  J' g+ Z+ d3 X3 W8 k3 _
                printf("a is %d\n", pshreRAM->a);* B$ w1 r4 C4 b6 v5 g9 J: L: S# d. x
                printf("b is %d\n", pshreRAM->b);$ L- y1 V7 q! \; _) p, F
                printf("count is %d\n", pshreRAM->packet_cout);
  k8 A# A' m' F& W, v                count_copy = pshreRAM->packet_cout;( V! m9 T3 i/ W7 `4 y5 ]2 n
        }; C+ n' g) i3 G3 w' M
        else
/ j% Q& T2 W% l' S        {4 T0 ?# Z' v8 h' J% g0 X$ Y3 S
                printf("No effective message!\n");
. ?7 a$ `9 j; u8 i) _, R        }
' }/ e3 i* e2 O, w, |  g- T}& R- Z2 }0 O5 D$ x0 r

# u* p- Q8 m7 O; v  A没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???; L, g3 y9 y* d+ D# h2 G

( ?5 H- d! L) `) \/ Z
0 c& S4 H0 \; {% V+ ]. _6 i9 V( l: e5 \! W! j& E

+ f) B$ t( a! o/ r7 P) {3 F
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

点击跳转“创龙科技服务通”

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

GMT+8, 2026-2-27 23:13 , Processed in 0.047939 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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