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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
+ A4 x4 Y# V0 R7 `
) C; H# t, |. J' u6 vOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
$ C, Y/ Z* G: c/ a' S4 @0 H' g#include <unistd.h>
6 Z! |- k" t# C5 F7 n9 ]% c: r#include <sys/mman.h>5 S' D! ?# ]. r/ ]- ?. l/ b
#include <sys/types.h>
/ D+ z, U( s# o9 ?/ H" c/ i/ p#include <fcntl.h>1 @2 ?2 J% `3 E: N/ C, c0 \

* N! J6 |& c0 K" Z6 U4 j4 U: p#define SHAER_RAM_BASE_ADDR    (0x80000000)     `7 A/ X& y# X( }8 j& x5 u
+ |, B9 H% v% b/ W/ ^
typedef struct
" ^! `3 j5 z; ~) W8 U{
4 l. g. x% _+ v+ B        unsigned int a;; R9 O, D0 y: U- B# b
        unsigned int b;$ g/ T2 @8 R- D  T
        unsigned int packet_cout;
- X) R+ t$ a9 t/ R! f% c}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;: @' J& f5 a! A3 B$ f
! t5 \8 ^, A1 l0 T; \
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
* A, u$ g% R4 \6 Ounsigned int count_copy = 0;
4 {; x! l4 o4 g' h& G9 _: ^' U2 F2 i5 ~
6 d- h6 W$ z' W
int main(): P3 Z* v; s1 w- O1 w% I: ?
{* S  |- @7 N, S& x' F! j
        pRX_MSG_PROTOCOL pshreRAM = NULL;9 R0 }, t" F" z) i) \& j8 T
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;6 h" x  U. R4 X8 T  u9 `

' U/ h. Y+ R% M3 F4 Y! e# O        while(1)3 t6 ?: t# `" |8 H, V5 t
        {! c) c" _/ c! ^
                read_MSG_buffer(pshreRAM);
; N7 b# _- j5 S+ z" v5 ^        }               
, H. H. }; V$ w2 Y}
( K# H) Q! Q# @# _! w/ C/ I  w- N: l- R2 f  z3 H
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
" z6 e/ i, P; L! A{8 s0 Q6 L/ r2 [# g! {
        RX_MSG_PROTOCOL buf;5 I% d' {( \8 [
        1 t6 _, b$ _% w. P: |& i
        buf.a = pshreRAM->a;
& Q# i( y, B' K0 `2 I        buf.b = pshreRAM->b;( t3 z% e: }* {) H. l
        buf.packet_cout = pshreRAM->packet_cout;
8 U& b. F# I- j5 |& H% y        # v$ b2 O+ D6 I% j1 f
        if(buf.packet_cout != count_copy)8 Z) M) z! a/ M1 {
        {
+ F# `. G- N2 i4 h( g                printf("a is %d\n", buf.a);$ ?; i* ^# T1 o- C% o
                printf("b is %d\n", buf.b);
; t' X' z9 S: q, Y# @                printf("count is %d\n", buf.packet_cout);. W8 }2 ~9 y$ t0 b0 `. P* ~
                count_copy = buf.packet_cout;
7 Y1 `2 W( `& [9 ?4 e/ O$ @        }. c! K; D; a0 P
        else6 m- e$ @( @; d$ n
        {* y9 u- o1 l: W4 V. P  v' [7 N- h
                printf("No effective message!");
# N6 C6 X2 D" F; p- r' W        }! p( n; ?1 L; k
}
2 E5 e" v/ }3 r9 r+ f4 `
. k& f+ z( r8 Q- p5 p. ?0 f2 h* k! r. j& `
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。- e! [" G# B1 \* w% Q9 t& X' W' O
使用下面代码,对内存使用了mmap函数后:# G/ P: ?- E& H# _8 ~4 I" A0 b
#include <stdio.h>
: R$ o" j8 F& u" ^#include <unistd.h>
* j2 D, w; T' [4 ~#include <sys/mman.h>
& E. @' u* P5 i: B6 X6 a* i# {#include <sys/types.h>% L6 h8 ]% T6 k& B( Q  h
#include <fcntl.h>  s) M* a6 J% ?# h! l5 Q& O" Q
( n7 _0 K, V; @! G
#define SHAER_RAM_BASE_ADDR    (0x80000000)
, W4 ?# I. Y* B& X! X- w" |#define SHAER_RAM_SIZE         (0x20000)   % u  z; E( o1 s
1 ]* Z: b7 g! Z5 E
typedef struct# A2 h& L. k! v5 G$ q
{( G! `) P, B0 e1 J
        unsigned int a;+ `: ^& D" x; S' H# H. I$ m4 U
        unsigned int b;+ q' t& L7 ?# i- f6 w6 a# y
        unsigned int packet_cout;
% ~# H/ P, }( J- X* Z}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 G, C, i  m) x6 l- i& Z; T$ a1 l
! S( o+ `1 s+ [$ ^) U/ bvoid read_MSG_buffer(int *baseaddr);
1 ]: C" k' t- r& Junsigned int count_copy = 0;, _  a* n9 L) m' x4 \* n  L

4 |$ z8 E2 G0 w3 B- A8 t, ~7 }int main()  w$ A1 |9 H; z3 a7 W+ `* j) r" t$ m
{
% s0 j( u# j9 F$ l/ m) @) z- v        int fd;
% h8 r9 B8 \4 d+ k8 f        int *mem = NULL;8 }0 r/ C0 G2 h* T  s. v9 f

2 T* O8 w& g4 ^        if((fd = open("/dev/mem", O_RDWR)) <0)% ~7 {$ i, w( ?2 g
        {
4 |; _% O' M) f( B1 K# \' o2 Y                perror("open error");
  y3 G- C& {) T# Y; q                return -1;
3 n5 E( d! m! s& Y8 ?        }2 B- a: w' q5 {
        3 B& C+ a: j/ H" q
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);4 S* E- j: w" A! O! }
& g+ c4 L0 i  P7 H
        while(1)6 G- u1 D% f5 t1 V' c% p
        {& _# J1 ^- K& q- o# D. z) R
                read_MSG_buffer(mem);) P+ P4 F/ m" @1 t0 `% O) N7 _
        }                2 r/ a: l  A& Y
}
! [5 Y, [8 d' r, |# m  j* i0 |  l; s+ C
void read_MSG_buffer(int *baseaddr)2 o/ c; h0 ~6 |1 s, D
{' _1 D+ E: C+ m5 H# ^# \4 K
        pRX_MSG_PROTOCOL pshreRAM = NULL;
4 |# \6 q8 M$ o% m- D: S% A4 N; X% x
! D/ O& N9 }# H$ Z( S$ |3 n        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
. y6 Z6 d) w! Y0 j  l" k$ X$ M# B. A$ y' U! a) o
        if(pshreRAM->packet_cout != count_copy)
2 K3 D: C# H/ ?  r' w        {
, P) }8 [* Q/ f. z                printf("a is %d\n", pshreRAM->a);
/ x& n) V  Q: ]                printf("b is %d\n", pshreRAM->b);# p5 w& N( _+ x  R  }; \! L
                printf("count is %d\n", pshreRAM->packet_cout);2 p. e$ H$ h, W6 R3 M
                count_copy = pshreRAM->packet_cout;8 u/ _+ I; `( j
        }4 z. E4 |: E# ~5 k3 H
        else
5 y. X8 M! n5 [, I6 c+ N$ M( ~        {
* o& o. Z! ~$ k1 Y; n9 P( D& ^                printf("No effective message!\n");
& b; V2 c8 H6 I6 b3 q        }% _5 ^7 g& r* w: Z3 |6 y
}
0 ]+ K& a. S; [! d$ z' d8 M1 J/ q# o: v4 B& `- T1 \( x: r2 n
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
: W3 I+ J0 j( f9 K# o1 d
) k+ u- l; p1 R1 N: {( N1 h/ r  w" }; o/ S

- B* C' j0 D8 I, m* C1 b
7 p% B8 u$ `$ I" k3 o
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-4 15:53 , Processed in 0.038304 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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