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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ' F: O0 D. V% e3 Q
! K0 B/ W8 P9 w+ v
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
9 ?  _; d) S; n6 S& x, y% r#include <unistd.h>
8 ^, H# G* V. M; _( J- d#include <sys/mman.h>+ |2 W6 t- n# u$ s. m/ j" E
#include <sys/types.h>
2 y6 V( ]. m; f0 Y#include <fcntl.h>
8 h" K6 M1 L, b$ F) O( M5 a- P' r- w/ |( a" u4 R) c  e; D0 |
#define SHAER_RAM_BASE_ADDR    (0x80000000)   2 m& m! ^7 H  }% o& j. ]7 |* |
3 J" q- g" x0 y# ~. u6 L( ]
typedef struct" D5 Z2 }; ~' O3 M6 u
{) L9 g8 F' W% n$ C7 Y- O
        unsigned int a;0 R! P1 e8 m1 g' X9 v
        unsigned int b;+ B- Q: _' X6 P8 C* _1 r9 {. t
        unsigned int packet_cout;% o" u+ ?* j% H0 s
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;' M8 i) h* x  v' ]% }  a& I

6 K/ N; \$ B& Hvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
6 ]  z9 f  M5 Q* i2 a7 Zunsigned int count_copy = 0;$ p7 z9 q8 w5 y9 V, U

- L) @# E3 j+ @( t9 o* |9 L' {: s
int main()- @" b/ V. l/ N' V
{/ [' p5 Q1 b5 F" R! m
        pRX_MSG_PROTOCOL pshreRAM = NULL;+ n& A7 j- s% Y% l: a$ e
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;+ T" E& K2 n% C) j5 j; u
% |0 w, }$ E5 @0 y1 H* v+ [
        while(1)0 Z9 E2 e* E1 g8 d5 }0 M7 R
        {
9 b8 p, t0 s, m- g$ f                read_MSG_buffer(pshreRAM);5 A7 S% e8 N0 H; U: G6 B" \
        }                  a2 y2 f( U' \
}
# P4 h3 N2 Y# S. f% c* @
! e  L4 p& {$ N1 [# A8 `! }3 |3 {3 }  tvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
( M* {3 w6 M5 E" ]) r{( m- n. J7 e) b/ }, }
        RX_MSG_PROTOCOL buf;, B7 K3 a4 q" y" y3 [  o: |/ l
        # P9 V. p8 _  c- G$ h
        buf.a = pshreRAM->a;4 K6 U; B& V: U7 U1 ?' \
        buf.b = pshreRAM->b;5 Y; c' l3 z" l% d
        buf.packet_cout = pshreRAM->packet_cout;0 J* f& B, J  I. i
        * G5 G0 ~8 A; A. M
        if(buf.packet_cout != count_copy)
& I' A. C- Y& O$ q. i        {
5 x& Y, m, C" A! N2 [                printf("a is %d\n", buf.a);: z' r" u. E+ P$ J4 a- y
                printf("b is %d\n", buf.b);8 ~. Z* H+ C4 @  e0 ?0 F" f% Q
                printf("count is %d\n", buf.packet_cout);* w+ ^; Y7 C/ A- u5 C5 E( h
                count_copy = buf.packet_cout;
9 ^8 I( Z$ T( K0 O9 w# q, f. d        }1 N6 L1 Q; I! h$ Y. a
        else
8 {2 n# t1 L0 V/ C5 k        {
, y/ j1 W6 \1 h: l7 x; t5 X                printf("No effective message!");4 S9 {/ j: D3 W& V- \, w9 u6 A# J+ T
        }" D$ a: T) g! u6 Y4 a
}
% S; Q4 v" r0 N! w2 a3 q+ p1 V9 F( [& _! Z# S: |+ i3 c  I
4 L/ N. r& D7 \# U
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
0 @- V9 T8 [; T: T, C使用下面代码,对内存使用了mmap函数后:/ U8 {8 s3 W) a) a
#include <stdio.h>
8 r$ b0 w5 P; l#include <unistd.h>2 Y; S! Z8 c- @& ]& }* J
#include <sys/mman.h>
, ~0 I" v$ B. _; h. L#include <sys/types.h>/ z7 i- R, T: n) q
#include <fcntl.h>7 e; Q2 U; H# G& s! \, t# L3 C

' R  b3 s' t5 l, E% T7 [- |: t8 {#define SHAER_RAM_BASE_ADDR    (0x80000000)( p0 Y3 ~/ k" E( m" p
#define SHAER_RAM_SIZE         (0x20000)   
! ^  t! `& W  m" d
9 d; f$ m9 k; ^2 Ltypedef struct: S4 P! d* X$ t( w% ?9 S
{  k& P" b$ L1 R& ?4 y9 t8 a9 d) J
        unsigned int a;
8 c6 V* N& a- t9 N# v; |        unsigned int b;
2 ]. X0 I9 F) L! W; ]        unsigned int packet_cout;
+ z8 }, H. {" u9 v6 }8 K' Z* n. x5 |" v}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;* h5 p3 H% d5 s7 _

' V5 `9 q( z6 [& j- c0 a3 C: @* g9 `2 {void read_MSG_buffer(int *baseaddr);
5 k$ c/ L! n' E9 T4 Wunsigned int count_copy = 0;
* L, w) G, {( M3 t8 I5 L8 z2 A; ?# f: L$ b/ B) {4 s2 _4 Z
int main()7 u9 n# H$ w) a3 w
{
: M5 H- ]% j1 m6 r( @" f6 |        int fd;
3 o3 L8 |2 @2 m( H8 T        int *mem = NULL;7 V* S  ?$ v6 _6 E: }! u

& W& q0 q9 e. D        if((fd = open("/dev/mem", O_RDWR)) <0)0 u( r  @0 F# l" L4 A2 e+ Y8 }
        {; U7 a* P9 M4 [+ L; \  n6 |
                perror("open error");
3 c6 P6 z7 E" C, J                return -1;
8 ]0 ?! d+ l! m  j        }2 ?" ]0 m7 V1 S
        2 @) b  I; g, {6 C4 q. g# `! ^
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
1 Q- \& F- v/ ~3 z6 e  G2 K4 b+ o9 i6 g6 I$ C" J& P
        while(1)/ B0 j5 P  t8 U; a# O# \/ T
        {
4 F# M6 B. j% o0 V6 j& u4 {                read_MSG_buffer(mem);
' E1 b8 T2 N/ ^+ f: A        }               
# x$ S1 B* J! _! p) P& D: A2 G! a' J}0 N1 ]8 z" q, h" }

+ f* D- z& D  V% q$ y0 x2 Vvoid read_MSG_buffer(int *baseaddr)9 }+ A, q3 x; g' x* E
{- w( J& M+ i0 o. k  a  z7 l
        pRX_MSG_PROTOCOL pshreRAM = NULL;" ?  ~: M& `* F  d6 `
! R5 y% K& G) {0 j8 |, B
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
$ [. O) U4 X6 e1 ?9 l
5 m2 ]# r5 J  o        if(pshreRAM->packet_cout != count_copy)
% i' q; b& r: p- m        {. o7 Q% a7 P8 t! D
                printf("a is %d\n", pshreRAM->a);; Z, t4 X4 B4 L' }
                printf("b is %d\n", pshreRAM->b);
. }0 s: E% m6 V  v+ A                printf("count is %d\n", pshreRAM->packet_cout);, ]$ q9 C( T7 C, A) z
                count_copy = pshreRAM->packet_cout;
) t& B- X0 `* A  {& m        }% \, c$ {. W+ p& ~) h; @5 y$ W
        else4 t) g- q! d# C' e( o+ f4 M
        {
% O; Q; ]- R% p1 ]) [) d; ]& o8 e8 C( I                printf("No effective message!\n");
# r9 Y7 u) S/ ^        }5 W' p. o" `- E& Y
}, J* v' ?5 m" B5 \: @  ~/ o

" v  x! K6 Z# ^, g没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???' w# N) F. a0 r2 E) X
. O# s- H$ ~- s- w: j' q
/ M, g6 y' C! s) L- o

* c/ k# k8 K$ _# G4 M
0 q( t/ z3 t% B( ]2 U
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-28 17:30 , Processed in 0.041239 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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