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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
& B7 Q+ ?* a% ^/ Z! N
3 o, l8 H( k+ u. T* a! yOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>$ l6 ~( ^' C0 }9 {
#include <unistd.h>
  U* \. N+ G/ F% P#include <sys/mman.h>- G1 U0 y1 p2 P; u
#include <sys/types.h>5 Z, `1 d" r0 |1 n8 J- ~
#include <fcntl.h>+ ]& B' I* `% s0 r7 n+ }

6 u( y5 v3 z# I* D. L#define SHAER_RAM_BASE_ADDR    (0x80000000)     K( W6 k1 W+ B& f- v" T
6 I! b5 U& w9 ^
typedef struct" g; D* W6 u) N) h
{
  b3 ^; m# o8 O: Y. K6 }        unsigned int a;; e; c7 C5 A0 m( J  u  b3 f! v
        unsigned int b;
- V4 ^% Y# J4 k        unsigned int packet_cout;
2 k' I( y( b3 ^. r) c) Z: K}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;+ k% I, W8 q4 V+ R7 e7 {

/ ^+ G# c/ [( l' i( f* J/ g9 ^, Lvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
7 g  G& A0 u, Tunsigned int count_copy = 0;$ q/ J0 Z6 Z, |( P  Y) Q& Z* {

# m1 n1 d3 K8 @. h9 c; N
- q: F4 L/ K0 m+ Vint main()
4 Y1 j0 U/ L, q  M' I; J{
5 t+ w: g1 a$ v! W3 A5 [        pRX_MSG_PROTOCOL pshreRAM = NULL;" X4 C9 a5 J1 ?9 E
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
; i1 m. z9 `' r
+ T  D1 e- X/ h# f        while(1)
7 f4 x6 U( s9 B8 p) X& B; [        {) G5 X" U$ \) M+ H
                read_MSG_buffer(pshreRAM);) ?5 X# f0 N+ m8 M/ B3 g5 h/ s
        }               
* |0 L6 u  _" q) G+ \2 y}
8 \- S. x; B: ~, I% W% x
7 |1 n9 J7 J8 X& K4 s& v% m- tvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
% l9 J9 F7 j- @# J! v$ F/ G$ @{
, c, s3 m. V' H1 w' i: F! e* Q8 j        RX_MSG_PROTOCOL buf;. M: J$ z8 |2 `# F' g* Y
        
8 R1 `9 |1 ]$ x. x+ J' G8 R        buf.a = pshreRAM->a;
7 h- \8 N7 d; z        buf.b = pshreRAM->b;
  `: L5 ~" F* v/ G        buf.packet_cout = pshreRAM->packet_cout;
  d4 t1 o+ a, O# T8 \        , d4 V4 J$ Z2 q2 ?* t
        if(buf.packet_cout != count_copy)
+ F. p8 [$ Q- _) r5 T- h        {9 L3 m" ]" T3 A/ A
                printf("a is %d\n", buf.a);7 ?- _1 R! F* D6 U! r$ T
                printf("b is %d\n", buf.b);
4 x% _1 w" L9 Q$ ?& X( X                printf("count is %d\n", buf.packet_cout);6 ?3 e& |) L% }6 `
                count_copy = buf.packet_cout;/ |$ ]3 _' [+ Q8 F
        }  Y4 V' e7 ~4 Z$ R% m( X
        else: n( p& f6 V2 i# A
        {$ t4 I) s! k# Y* {
                printf("No effective message!");( }8 V; Q! s9 g$ B. [
        }( p3 ]/ w" l) w. \3 P
}) [* }8 Y& ]( V6 T% e& e/ f

; e" ?) n2 a$ |' |& x
  N& q( t/ z2 Z8 v但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。3 k. a( @; E7 {* s& v
使用下面代码,对内存使用了mmap函数后:+ p5 w5 e1 k/ M( G0 i9 n. ^. d4 q
#include <stdio.h>0 C2 ~3 u1 d( R. I, D' E7 ^
#include <unistd.h>: }$ h. W/ T5 Z& Y$ B
#include <sys/mman.h>
$ L2 S6 f3 `" `8 V1 c& q#include <sys/types.h>3 Q! {4 ^' `% p% _: U: P$ Y
#include <fcntl.h>
- S9 [9 D- v  E: d3 c" `& C' q  h4 a( v% t6 \% v% _
#define SHAER_RAM_BASE_ADDR    (0x80000000)
" o: ^' |* d) }#define SHAER_RAM_SIZE         (0x20000)   
/ X5 j# e% A( L: t. b2 F9 v; A3 ^+ r+ w0 X
typedef struct4 S2 a2 U; P+ A) G! u$ P: v- J% q
{, w4 T( @4 G2 L0 y7 I1 r) n
        unsigned int a;3 Q5 b  `1 |4 t4 Q" ?3 A! m
        unsigned int b;
; a2 E4 v' N$ q* }  p        unsigned int packet_cout;
. X" i% k! M1 C}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;# F" `& x$ F! S/ f! E) z
9 a' S2 h5 D( n8 p
void read_MSG_buffer(int *baseaddr);
3 C/ ^) M" T9 i# Tunsigned int count_copy = 0;
* j& Z* r3 l6 D! I+ ~7 G: K# |& p7 s
int main()
5 U) w% D7 [* R/ {{
$ u) N9 h, P! d' F* R        int fd;
) ?& C' l! {' |        int *mem = NULL;
5 Z9 r( R* q# {/ o( r0 V0 \# t( w
2 A( ?- i8 E' r7 v$ r3 Y0 }. n; ]        if((fd = open("/dev/mem", O_RDWR)) <0)
  N0 k9 W' E5 U' |; o" u5 A8 _        {
7 P7 |# k6 ]. }, X* \                perror("open error");
. f  ?9 b, k9 K7 w+ E- O; x$ o; ?                return -1;
( s0 ^* x+ }3 P        }
: G7 c3 v5 a8 L9 _0 Y" ~9 p' V        
% @8 `& h& a+ V! U2 N        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
7 x# Q' e& ]0 P1 q- D0 F; m
6 \" s0 g) w6 a2 S' ?" ^1 |" D        while(1)8 u7 O& X. I% {  T& @
        {
3 Y% |" @7 _% R' N3 p) r! K( S                read_MSG_buffer(mem);
1 O2 d' e0 \5 m- h# Q        }               
9 v6 b' S. V5 |9 R8 y* _& j* s}: ?+ l  E" j4 @8 G- g' G1 q
5 O6 d- z6 H( c- e
void read_MSG_buffer(int *baseaddr)  f. b9 j' {" z% W
{( F; m6 L: C2 `+ _: d
        pRX_MSG_PROTOCOL pshreRAM = NULL;9 t9 c. U7 m/ \
# H! @( s4 V/ s* Q
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;- q9 o6 u' F: _

5 G. X% |8 U, f1 E- \        if(pshreRAM->packet_cout != count_copy)
/ l1 v: r. a4 @1 `6 W+ I. T" K        {
# K' A* k- O0 v9 u, }' q                printf("a is %d\n", pshreRAM->a);) A) p( a& V8 x3 X* K! [
                printf("b is %d\n", pshreRAM->b);
: T  V& L4 d6 U4 E0 S, O* q                printf("count is %d\n", pshreRAM->packet_cout);; ^! Z& _8 H6 d% p# B) r
                count_copy = pshreRAM->packet_cout;
: P# N' m+ M  }8 S$ `        }; K" j+ M3 Z3 [* e6 |% D! a
        else* G$ V. R+ Z; j& t' c, S
        {
' p) \( g* p9 K* J) M( d8 G. I                printf("No effective message!\n");0 E5 n+ \' l! l, R$ P# v
        }
9 Z  {( S; H1 U" L2 i, Z}
$ V4 K+ Q. c; Q( M
" _% Q( F1 M# y3 w* Y! M没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???; `9 K; g6 k  D. X& O0 l( n

4 f1 w4 ]' A+ }& N+ ~3 y7 f- n  N- F, j% k
4 N; V" y. J0 z0 Q

2 P7 ?" b/ _9 f# C' h( ^9 \
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-4-9 07:45 , Processed in 0.040385 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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