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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
- T5 K1 @. ]" ]% \' ~
6 S' ~( Q$ `9 g( w* M& \OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>( `% I" k* K) t  `" q' y
#include <unistd.h>' h/ r$ ^( F7 K$ M+ U0 A
#include <sys/mman.h>2 n6 d% U4 ?+ ?$ x3 f/ Q
#include <sys/types.h>1 Y% m2 U( I/ {5 H6 v
#include <fcntl.h>0 p' t( ]# Q9 Q" _. g4 ?

& ~, S# s* x) t! E% z6 V" a#define SHAER_RAM_BASE_ADDR    (0x80000000)   
& c: u! x8 ^8 F! V, o& F7 @
0 i6 M8 G4 @# G' n% `* ctypedef struct
. L1 l9 ]$ k) c0 a{" h9 k4 ]( y# g1 @  \* M
        unsigned int a;! [2 |9 L0 f+ s; ^( }! b) p
        unsigned int b;- {' {2 |8 k9 z/ @, A' r& f1 O  d/ s* I
        unsigned int packet_cout;
' B/ |4 _7 s- X2 Z. S; }}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
7 S4 l/ D% o; f* n" E0 e
. R2 Q( K- p9 z2 T* Zvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
3 w( T: h/ T) {: \. U! ?$ Hunsigned int count_copy = 0;
2 f& t2 Z9 H2 m# V6 j$ h
) r6 `! _* h$ ?5 ^  H6 k* N! |# U. }" m4 ?& |
int main()% E' e% |% n( t
{% I( Z' @% P& ]& ]+ C* p; I
        pRX_MSG_PROTOCOL pshreRAM = NULL;  p. H2 a4 J6 O2 }8 l
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;1 w- |( ~5 X' [; s$ M

7 ]" y3 z* s9 [! k; A1 G- H        while(1)
, ~$ l+ K- Q* i0 C5 D% e        {
: g8 n9 j6 ~! G4 H                read_MSG_buffer(pshreRAM);
2 ?4 v( C; w5 W  G: X& W" K5 W        }                  t8 q# I# e' Y, `0 ^4 w
}
) h& F) w( V9 l/ _6 B: X. X: ~' o  I2 g. z) c" X6 j
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)9 E7 b- [/ n- q5 l2 w; C
{) E  o4 Z6 Q6 e1 Z
        RX_MSG_PROTOCOL buf;
/ [" {# R: I6 v2 |7 w& L7 d6 t        / D0 W5 o) m7 t& B8 v- N
        buf.a = pshreRAM->a;! }! K/ B9 m) g3 A1 ~
        buf.b = pshreRAM->b;
" a$ e& E' @) W% c1 m1 q6 ]; B        buf.packet_cout = pshreRAM->packet_cout;
/ U, I( y# S& @/ f2 v* v8 S/ X/ g! g0 O        
+ M& g4 y) P* C9 R' O4 b        if(buf.packet_cout != count_copy)
" H5 V% Q3 @: O& S3 o8 b- t! ?1 l        {
  a4 c4 n8 l6 w1 M# |                printf("a is %d\n", buf.a);
2 k# A- G7 p: u1 o                printf("b is %d\n", buf.b);
; H& Z+ |! n! W                printf("count is %d\n", buf.packet_cout);
$ `! z) A' g' g" X) b2 g& J' }                count_copy = buf.packet_cout;
1 d% Q: i, N; u. @0 s. u' |        }3 o& r; [- u  R( G4 p
        else! o8 p+ b. X  x9 B
        {
8 T4 B& |9 o, H" P! s' R+ U                printf("No effective message!");
+ d7 Z; f& P! e# s. L8 s" u( x1 w        }
! H0 [  e0 D, N4 {& S5 ~; A' x6 h}
8 `. m, A( C- X1 J. f
! x4 _3 D& ~3 g: s" C
9 a( x! n( W1 u2 I但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。/ f4 q' v- [2 @$ I" l; m7 o: }& ]) I8 ?
使用下面代码,对内存使用了mmap函数后:+ t3 t4 c' M- H# ]5 F
#include <stdio.h>5 z: g! K& a/ K  d  q* r; \4 L* x
#include <unistd.h>% R# _/ Q# [0 F' l7 k* q4 X- m
#include <sys/mman.h>
0 M7 N) l$ W" E1 m1 H% ?#include <sys/types.h>
: p! M3 K+ W9 j- |1 [0 i4 O9 b#include <fcntl.h>
' [% |( ?, n; A, q; C6 r0 l
' R8 y  J; |0 @% F7 a6 p" Y#define SHAER_RAM_BASE_ADDR    (0x80000000). D' W9 L1 u' y
#define SHAER_RAM_SIZE         (0x20000)   
. F% f! O% _3 R& v7 W* u$ \5 K
$ F( ?& S( A* r; ?typedef struct
) v, L" Q: q2 x5 j) C5 |{
) Y: R9 A) U6 Z6 N4 ?9 C        unsigned int a;
" g+ _& `- u  S( ?/ u2 J5 e        unsigned int b;
& E; t: g0 D5 t- j( m        unsigned int packet_cout;0 W& u* m5 w& M: ^# ~1 R
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 o5 Z+ o* y4 }& _% B9 B3 V5 d" t% f( l# o8 [
void read_MSG_buffer(int *baseaddr);' Z6 P0 _: U5 ]3 o. v
unsigned int count_copy = 0;7 B: f5 L. V; G9 e, X) u4 ?
4 j/ f% {/ {& q! R: X
int main()* P# @' a6 N" M  K
{8 p: p$ N" M5 o8 ]* r' a2 f& X3 F
        int fd;9 B4 `* O: }9 Q. t1 L, {" ]
        int *mem = NULL;. V) x" ^( D; b+ ?" A: f0 S# c

# {; x, k4 y* Y        if((fd = open("/dev/mem", O_RDWR)) <0)
3 C8 W4 @% D  p* f; @# I) c# S        {" o7 I4 [. U4 p8 M' G/ R0 ]
                perror("open error");
  u8 N# X% N- P: X; g                return -1;
6 ^) p7 N% x* a/ F  O' ?        }, v% ^0 ~: D$ y/ {+ @
        : d) s! h( `. B4 H) `+ y' v8 f3 ~
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);+ @" x& ~5 ~$ @, m

* [- _6 x, u' [" e% o        while(1); k6 @# T8 B* V7 Z
        {
. M. Q! R2 `' h( ]5 V$ A                read_MSG_buffer(mem);& ?9 Z1 D$ ?* ^% n
        }               
2 V+ f, w% d" D9 e}
( U" ?2 Z+ S3 j$ l! j
4 X$ f' ^! S* ?6 z  _* ~void read_MSG_buffer(int *baseaddr)% j2 W+ Y# z1 h9 y/ t7 j$ s* u& n
{! t1 M  _4 P2 `
        pRX_MSG_PROTOCOL pshreRAM = NULL;
4 E8 B) Y, J* o/ ~' o* _
" b6 z, O9 g- H1 M1 ?* E8 s, H        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;5 q. k& Y) _; z5 }7 `$ Q9 h
" J8 a" Z9 W# \) p
        if(pshreRAM->packet_cout != count_copy)4 J6 X% F& ~, @2 H( H! c
        {/ ^+ Y# y) h4 W, y* J, o1 u
                printf("a is %d\n", pshreRAM->a);
! Y  b5 ~& v. n, ?                printf("b is %d\n", pshreRAM->b);: H$ u. y% P, ]7 g5 |
                printf("count is %d\n", pshreRAM->packet_cout);
" }1 _$ j8 p' J; V2 W) n/ n& T                count_copy = pshreRAM->packet_cout;
$ [2 y, K# M& e5 }        }
2 f, r8 d8 n+ m        else/ D& y4 q) Q: C! ^+ h, B
        {
# N; J2 J; H3 L                printf("No effective message!\n");* b# L* I2 \. V% G. i! K
        }
* \2 ?3 g9 e+ ^9 L8 N' z3 c}
4 b- z7 V& R! t$ ~) Z5 ]3 m5 S5 W- I9 i
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???7 W/ l: j! c& G( d

/ @: B/ U6 d5 h4 p) [* V/ ~. x) b# e  V! n

+ @! N& O- x  H$ o" W# y& K( J3 {  f" e- z) _+ e8 \) p+ B& x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-11 20:23 , Processed in 0.050183 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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