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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
' i% \: {' h8 P$ m9 K( H7 l7 c
6 ?% M& B6 S3 r# xOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
# Q& s& ^/ u! p- z7 z. h  l8 u#include <unistd.h>) z: F, t5 O$ |- ~& @) R  R7 O
#include <sys/mman.h>
" N" P* y, l2 k6 v. J! B% Q( K#include <sys/types.h>8 P  O# Y7 Z  [+ k
#include <fcntl.h>: x/ y; P3 o/ V8 t0 ~& K- \9 X

0 @; O/ Z6 p5 Z0 |5 n" i+ Y; X; J#define SHAER_RAM_BASE_ADDR    (0x80000000)   " U% `! A- Q/ W9 ?  U- @0 r  a
  _2 Y" r) }! r8 G5 Z* _7 k
typedef struct
/ U6 ?; I' c! v8 Q, f6 K8 i{
8 E' A. J( o8 b9 h4 c) a        unsigned int a;2 [  q" C# D+ @! v: n5 [- s
        unsigned int b;  O3 B6 V( T& j7 ~+ S2 s
        unsigned int packet_cout;7 T% r* n, `/ C/ w' g8 ~
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- W1 s2 Q6 k; v5 j1 B; I  |  \% i, f& r
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);: p1 r% ~% {3 G+ B, c
unsigned int count_copy = 0;
& h( e' K% b$ y  a* I& y4 Y/ @2 C/ I6 C

, G* i# ]5 e  q1 i- c# @, v/ bint main()
1 V, c* _! D" X% A' ~* x0 e{
0 \. Q; }# F0 c8 n. r7 n) i0 u/ R        pRX_MSG_PROTOCOL pshreRAM = NULL;
. l2 l) w* y5 F+ R& t! P        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;& y0 m# |% \8 H/ T7 P3 O# ]
* W, Y& I( h! a' A
        while(1)4 B- l( [  _  C# x
        {. x, [* C! |. o1 \- D# @) g
                read_MSG_buffer(pshreRAM);6 ?8 g2 l1 g' O4 w  @
        }               
( Q+ t$ r. R: a* |7 @% R( {}5 Y1 T: ?: @# G8 t. A5 n$ }) ]( V
& P0 ^  V4 W1 x) E2 Z4 j
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)& f, I* n& H2 p$ R) }0 [5 S. @
{
* _& |4 N9 S. q3 m' B9 L8 j+ l        RX_MSG_PROTOCOL buf;7 \( J3 P2 f. Q! b1 w
        2 I9 G  b' _0 \4 l9 T9 o: J, h
        buf.a = pshreRAM->a;
: q" N  g; Y& k, f9 c        buf.b = pshreRAM->b;
/ U) S. |; U' n9 e0 W  t+ s        buf.packet_cout = pshreRAM->packet_cout;0 q/ I% `" Y& i
        
: Z" \/ r- h9 n# b  }        if(buf.packet_cout != count_copy)9 w& k/ f; R7 N. j& x: }; E
        {
$ c$ K9 R; L, p# ]! i: ^                printf("a is %d\n", buf.a);4 G. Y, V3 M% x9 ?; O- Z
                printf("b is %d\n", buf.b);7 w5 [# I) B2 J8 f8 q
                printf("count is %d\n", buf.packet_cout);
  W$ f9 _- @& l( |3 G2 U3 B                count_copy = buf.packet_cout;
  B/ ^% q5 K# g        }+ Y$ ]& u& X5 [6 v! ?' k
        else
  Q  _8 g5 X- s: P: N2 I7 n        {
8 [+ x' u; i& y                printf("No effective message!");
1 ~. I3 T2 o! N: }0 M# v* {, L" N        }# U9 N( T) \1 O2 p* e8 f6 ?
}- W8 L; q- D% h# [- j9 L% O* T3 Z

1 x0 C$ K3 {6 g. Q3 a+ ^. r
6 J7 v* I+ K4 s$ ~+ v# A$ j但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
. z$ {5 v& g* C7 d: X3 r- a+ g* n5 A  [# @使用下面代码,对内存使用了mmap函数后:
7 Z4 w9 }. W2 f( m) v#include <stdio.h>& Z3 ]# w2 B6 O$ L0 n7 E& ^# k. G
#include <unistd.h>/ ]6 G/ t( p& b% c
#include <sys/mman.h>
  l' V2 D9 F0 Z% v( s* W* H#include <sys/types.h>% J4 |7 B8 E& M  I3 ^; u( P
#include <fcntl.h>
- E" S) q( \4 ~
- r3 K7 x2 u+ Q6 ^#define SHAER_RAM_BASE_ADDR    (0x80000000), _7 X' g- r. B$ W. p
#define SHAER_RAM_SIZE         (0x20000)   
0 M, Y9 I" [7 I& Y0 z/ `; J) G+ ~2 F6 ~$ B8 Z9 R
typedef struct
0 I- \5 w. j2 [9 \% U; ]{
# b. U$ h4 o) ]& {        unsigned int a;' f1 t( S6 i9 L/ _3 J- C
        unsigned int b;
, G/ J( u0 X( o, K3 e$ ]+ k9 a0 h( N/ l        unsigned int packet_cout;
- N1 G! e9 R* c0 ]}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
+ U( n8 K: o; `7 b3 g7 c6 {3 M7 E3 j$ g6 q5 X1 ^
void read_MSG_buffer(int *baseaddr);
2 q# T7 W3 B5 y1 K- x2 o$ ounsigned int count_copy = 0;- M) E; v; t& q

. d' K2 j! s! A' w# T: q; \int main()
1 ^7 Y3 s" {  L3 M{- g9 Z+ D2 L( L9 F
        int fd;9 b- ?# p7 [4 Y; `6 O# b
        int *mem = NULL;9 w3 a% |8 g2 d' @8 O- S& r7 v  p
) f  T4 K( a$ _) a+ E$ N, Y
        if((fd = open("/dev/mem", O_RDWR)) <0)
$ n& U" V6 I6 R. X, W+ E        {& i& B8 f; ~1 F- R) Y: H; A
                perror("open error");& j5 I) _9 X7 z/ F9 k" @
                return -1;4 E& w# M: }4 t
        }
' ^% M1 b) ]) ^+ U: a        
9 ^: n6 ?0 u2 z, z        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);) Q- E: V# b8 L

+ N  U5 H! s  F6 D        while(1)
! r# }# @8 L8 \        {
7 }* H3 c& n% k# {                read_MSG_buffer(mem);3 G% W/ f% o, h5 k, L( {# x3 G- ]& p
        }                ! q$ J5 D1 f4 v8 L9 \' }; ^) j1 F8 H: g
}
7 p5 o7 B. d5 g) `# B) C# I# N! D0 U$ b: S5 E, s: k9 A2 U$ t( @
void read_MSG_buffer(int *baseaddr)
! p% ?  `0 x  }{
6 O; @; t+ s; Y! q        pRX_MSG_PROTOCOL pshreRAM = NULL;, P% V3 v& Y* @* i( h
. j& `- c2 u5 N7 a6 |; D; R% F
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
  J9 R1 K# J6 Q8 U/ h" U
+ ^9 G1 P' r& h8 g! O" z: p) l        if(pshreRAM->packet_cout != count_copy), q6 F% p* k- R, B- A! A4 g/ q) O
        {) [2 _9 q! k" a
                printf("a is %d\n", pshreRAM->a);
* M  D/ a1 X4 }- ?, |) I& s1 Q                printf("b is %d\n", pshreRAM->b);  ?+ {# i+ D7 C9 B+ |# p! d" C
                printf("count is %d\n", pshreRAM->packet_cout);- |) D- B" `' Q1 Z$ Z9 P
                count_copy = pshreRAM->packet_cout;
, \& a$ O( r* Z7 l1 N8 D5 i+ ~        }3 |; s/ c) _, b4 t9 T
        else
3 R* i' U- L6 p: p% F" r( Z. S' M        {8 t" x, H8 F& i1 n3 r
                printf("No effective message!\n");
3 Y/ r* x/ w( @0 Z        }0 n1 M" G3 q: |; f+ z
}
  z3 b7 E% G$ P5 G+ \0 k: p" H3 I# G/ S* {* n& S. [
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
+ ?$ k1 X: |( \. d& W' e% b" F; |! `# B! u1 U7 \
+ o1 k: h9 q/ |  F
9 p, v) V0 `8 T3 S
7 ^7 |7 j. p" e) c, N
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-1 02:09 , Processed in 0.051363 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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