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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
  z' Y; J; C9 p" s& t2 I
! `8 R+ ^& A# S! F* EOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
+ Z0 p8 q  o! Z3 S' c% e$ q#include <unistd.h>
5 C) \7 D0 Z+ ^4 i#include <sys/mman.h>
5 P  u# g. b& ]: Q/ z* t! r' J#include <sys/types.h>( H6 |6 Q  e- k$ h
#include <fcntl.h>
# n7 V6 [) n6 }
1 v: f8 W: Z) `0 x#define SHAER_RAM_BASE_ADDR    (0x80000000)   & K# G8 \* W6 K9 J/ ^/ a

# E3 ?* {& ]& l$ L) I3 jtypedef struct% z9 v0 z! J/ U8 e
{4 R: ?- X9 {  C
        unsigned int a;
. W3 L- T- K. W4 l7 T/ k        unsigned int b;+ Z$ L% S: V7 K1 [4 _
        unsigned int packet_cout;
" P3 L, q! v, s% W9 L0 i}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 m- f8 ]4 q3 U
1 z/ ~# M+ U( i7 N2 Bvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
4 U$ a0 h1 ^: _) Junsigned int count_copy = 0;9 M8 t* I% Q  {* u4 N
1 \/ A- V+ V+ C! [5 k

/ K: \+ U& ^) k6 ^int main()% ~! e1 X$ c, Z* D  ^6 x1 D9 C, M
{
1 z/ q( o: e: `( W6 v, ]        pRX_MSG_PROTOCOL pshreRAM = NULL;
/ w1 Z4 t& R/ T2 `. J        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
5 C1 x7 M! P9 ~% f1 p
) [- M6 ?% i3 C& M        while(1)
4 K0 v% J; X* i$ w4 B        {
: |" i, K5 t7 G9 U( Q                read_MSG_buffer(pshreRAM);. d" S8 \; x$ m$ g' y6 u2 h
        }               
& q& T+ A2 T( m; [}) J; @6 O( V* f1 q
  L& M, G. O* H, H6 x$ x$ y; T
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)$ A+ E( H$ \& M7 J8 J7 B
{6 q8 V! n8 |' |- \/ u
        RX_MSG_PROTOCOL buf;
3 h/ V; _2 v9 t/ v7 I          L! u! A  a2 a0 `: E) r2 W' `
        buf.a = pshreRAM->a;
* P. d" Q1 c' n, k+ b        buf.b = pshreRAM->b;
1 \8 M# _2 j  u* R        buf.packet_cout = pshreRAM->packet_cout;
% \+ r: P/ @1 @) b        + T* Q3 V/ W5 R+ \2 \+ m/ ^
        if(buf.packet_cout != count_copy)
% L& }3 v+ B; w# J  m! E        {
* c( w! j9 P3 C( q6 I                printf("a is %d\n", buf.a);, [+ a9 g) R% x0 ?
                printf("b is %d\n", buf.b);
7 T1 U. g; G; J! i/ ~+ ~. ^                printf("count is %d\n", buf.packet_cout);
4 N! s/ T) q: [; G* q/ g% x& f' C                count_copy = buf.packet_cout;
, y, U8 X- {0 D        }4 V4 u2 p# S; |7 `$ `
        else
7 p: e" j/ k# d        {) [$ B/ l: ?+ c3 C
                printf("No effective message!");
# [* l4 e5 c9 k3 X+ r% j        }/ p4 K9 A, O3 D: z4 g
}/ W# u9 T5 R/ B
3 p# `* b* N- c1 q& O7 e1 Q& R

/ R# a3 G& |- o* z但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
5 k( `. ~) r) o' u7 B8 E使用下面代码,对内存使用了mmap函数后:
# G) t$ h8 r& C: _' J# o- P1 G#include <stdio.h>" o: E# q# B* l) T2 h  x
#include <unistd.h>
2 {& S2 Q# T1 I! y& y3 l% J#include <sys/mman.h>
0 j" e' q5 }4 s! d" J& a& o#include <sys/types.h>
2 ?  D! r) d  s) f) z6 `% A5 L  }4 C, C#include <fcntl.h>" v* R8 r& O+ E
8 O" T8 H( r, h/ P% q/ j
#define SHAER_RAM_BASE_ADDR    (0x80000000)! @( u8 U( J* B9 G& ]
#define SHAER_RAM_SIZE         (0x20000)   % i  e8 x- h4 {+ n  v

5 r9 ~; s6 W$ c- ]$ }; \typedef struct) f7 Q: K  p0 b4 s' }. \+ z$ ]) c
{) A7 _% f( ?/ Z% \+ h# w; S
        unsigned int a;
2 [" V( f+ _2 t) h) g        unsigned int b;
1 ?5 N" ?& k! L$ f        unsigned int packet_cout;
, [; Y- Z1 j% q' _: F}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;  f" }6 f0 o6 F' }5 |

1 c8 l* A! o. M4 J4 k1 M9 mvoid read_MSG_buffer(int *baseaddr);4 I, l( \5 s' S1 g- q
unsigned int count_copy = 0;7 M9 {# }" d9 Y6 ~
: y8 ~& @  L* c! _6 V* L
int main()% G9 X$ F( t% D& C  K. `( o
{" @4 J- R, O7 F8 `2 y" e
        int fd;
& ^6 F( ?" r; g6 s* s        int *mem = NULL;
* Q0 }5 q+ q' `) f3 G- B. e- l( ?2 n9 b/ T* }/ {1 r( G
        if((fd = open("/dev/mem", O_RDWR)) <0)6 o4 E5 m; A) ^) H- v
        {; n9 v6 P- w+ W. C: E% W
                perror("open error");
, m# M% ?8 p5 n% a# D                return -1;
1 m* z4 E$ j' [& L        }3 j' q/ U6 _- P0 }7 n( I
        0 ]& d, D1 [: w) }" x/ C
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);0 W& @! c0 E9 e3 d' G4 ^* {
: W3 j9 y6 m' O  L8 h% }
        while(1)
6 I: ~* \1 M% b; u5 f        {
! _& A- t  v6 d                read_MSG_buffer(mem);
* ^3 Z! H) l/ [' s& v% M) ?        }               
  W+ u, U. l; Z! {/ l" |}# b$ i( C0 N; [" z# }. `' ?6 _; c

* y  Q7 I: L+ C) b& b) ~void read_MSG_buffer(int *baseaddr)6 E! @6 b3 I' t* l$ @4 t
{! [0 _, r6 ?, G% ^
        pRX_MSG_PROTOCOL pshreRAM = NULL;& l8 d) P; w6 h2 D$ C" i* H! |

" l; d" t, p1 D5 f7 y* a4 H        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;; k3 u. }7 ~+ O' r. O: r
' v1 l2 l2 N) x
        if(pshreRAM->packet_cout != count_copy), q0 D; y3 k* J7 r4 _, J+ r; _
        {
; p( Q6 p. d* q) k! P                printf("a is %d\n", pshreRAM->a);
1 Y* v9 s2 i% k2 I) g                printf("b is %d\n", pshreRAM->b);# t! h/ G! L+ J5 Y5 v. D" E  E
                printf("count is %d\n", pshreRAM->packet_cout);& w4 R$ r- ]& t$ `& F  v1 C, q
                count_copy = pshreRAM->packet_cout;
- \+ {1 O* `+ P. q1 X        }
2 P- }4 H+ D1 S, Q- q        else$ B- W0 C; m* M
        {* a2 C( D- W7 z- f. v1 F
                printf("No effective message!\n");
- G% C, p. `& l; ?3 E; U        }" C! {2 f' S) C# X$ s+ N
}) \4 h) r& _4 c7 Z2 [* g

- W! H. M  T4 p7 ^; O没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???1 o0 [0 F; F. q

* b; M' a0 M) D# U- E, t  t- {- O- n" y9 N5 B- f/ Y6 n

' B  n! o8 E  `2 t/ J7 F/ ^
- Y- E9 h1 G- M: z& l; Q# `2 r
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-20 23:23 , Processed in 0.046258 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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