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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 2 i5 v; \# m+ q$ ~+ P( b% u/ f  u
* Z6 @/ ]% y4 {% C$ e9 G
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>. {* S8 f" p, ~, L8 |. {
#include <unistd.h>- B8 i. O3 J0 Z' y; d# A
#include <sys/mman.h>
- M7 u# X) |5 P! F2 \; ?' J' J#include <sys/types.h>, q1 z4 X' ~9 W6 a( s6 q
#include <fcntl.h>4 |, G1 i6 e0 K/ {2 q! \
* i" X. i& ~; y$ R6 V
#define SHAER_RAM_BASE_ADDR    (0x80000000)   % M- m  ~/ Z' i/ O, q- U

* B4 W( B* @+ [6 T! B9 rtypedef struct
" C6 n- t* t: V7 f5 O  o{% U5 V. I+ h/ d# X1 j, l
        unsigned int a;
) l: h& j5 i7 Y% Q, s: |" }        unsigned int b;0 n  |) Z0 C5 _3 e4 ?
        unsigned int packet_cout;9 }- U- S' Q- N
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) r& p/ l3 Y* \7 Q  v, h$ N- s
/ u2 e; C3 Q3 D+ w  ]6 ]  y$ t2 u
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);6 j# c& ]1 l( I  R! o
unsigned int count_copy = 0;* r: M3 R& j3 W6 ^2 N1 m' t
0 K. h* [3 c2 f5 [5 F
6 O) r+ ~, S$ [8 [& {& _* d+ k
int main()
0 a& {# Z  e( u8 N; O{
! k8 f' y, J  H        pRX_MSG_PROTOCOL pshreRAM = NULL;5 V! l; H# e% O  H3 e# D
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;' B6 ~% V. _! k

8 f# E+ S, k+ q: c# P% K- i4 X        while(1)# }+ n- R, v3 K  Y- n
        {$ E! Z- I0 K  ]) Z0 f1 e
                read_MSG_buffer(pshreRAM);" X) b" r$ e" M3 w' \1 |! W. z
        }               
9 @  m$ W8 E( }9 ^  D/ a5 G+ M}4 M- R" D* f4 u4 A: E* w; q
3 X: }/ Y7 m" o  K0 T% r. O3 N6 ]
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
! }: J1 g9 f. f; P& C5 [{
9 g. F& U0 D) B0 D: T        RX_MSG_PROTOCOL buf;3 n/ t2 i9 r+ ]5 A/ `
        ! P3 ^/ E9 |) w1 b9 i2 x
        buf.a = pshreRAM->a;" h( ]! G/ ~! C$ V
        buf.b = pshreRAM->b;
# M# Y$ p; U5 i2 ^7 f; ?        buf.packet_cout = pshreRAM->packet_cout;
& R1 Z4 o" x: r. [; G+ t        
- p9 t+ [+ o; I        if(buf.packet_cout != count_copy)
& N1 \" o  ]& [3 P: j        {" ~- W: B! S  x0 v' S
                printf("a is %d\n", buf.a);! L# X$ W. g9 x" ~! B" L! M& F6 b* h. e
                printf("b is %d\n", buf.b);
/ q6 ^7 [* w% v, f                printf("count is %d\n", buf.packet_cout);% h/ V2 l0 {' Y0 v( ^5 V
                count_copy = buf.packet_cout;( s& Q" p7 @, u' H# L) p5 b
        }
) r/ r2 ]0 a6 i4 ~0 b8 ~4 l1 y        else
6 x) O0 S9 @+ Z$ Z$ Q        {" ?% X7 z) p2 Z6 c
                printf("No effective message!");
) ]2 n7 c# f% a        }
8 k) O. h3 h' D}  K' w4 p" ~) Z- o
0 z) q7 r; @! ~  @% Y; j2 f
8 K: j# n* E/ Z
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
. m0 D- a4 T+ v: ?5 z使用下面代码,对内存使用了mmap函数后:1 ?" |% F1 T& z0 x8 b" f8 D) y
#include <stdio.h>
" ~3 o: W0 Q1 Q4 D; H#include <unistd.h>
: @) O- W8 h9 f7 ~3 |#include <sys/mman.h>
# P; t+ P2 k& n: e#include <sys/types.h>
/ f) n8 K/ c) ?" {8 ]3 ?#include <fcntl.h>9 h$ W( F# p, [! J$ _

& u, `2 L5 m& Z& I6 Z2 N! M. y- s#define SHAER_RAM_BASE_ADDR    (0x80000000)& S. ?* Y5 ^) `9 u% T
#define SHAER_RAM_SIZE         (0x20000)     K  b3 P; l: a$ }' P

% o; n  v) H7 u7 [2 g8 K0 Z3 Htypedef struct
; g. r. W- |/ b3 G. n) D5 a{) l# K" M1 |& J% \! j
        unsigned int a;
; L) W8 k# k2 z; J/ u0 D/ p6 `        unsigned int b;
% W2 T3 D  c. F, ^# x8 P% ?% J        unsigned int packet_cout;
) `- S. x3 b# N3 b}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% ]5 U9 T6 d' p8 j  ^
$ Z* V& p7 u" h+ a+ Xvoid read_MSG_buffer(int *baseaddr);
4 B& v# W" S& U! funsigned int count_copy = 0;9 c3 T4 h5 P6 [; ]( p

/ v# g- P0 A9 G4 b" v. x$ gint main()# f* j3 M4 ~. ^# u9 f: f5 i+ W: Z
{
# s% e& B$ l3 J  a        int fd;6 r' U2 M) b/ |/ g
        int *mem = NULL;2 a2 X) {  [- L) S. n# Q

3 Y1 `- C5 ~9 F        if((fd = open("/dev/mem", O_RDWR)) <0); j- J: k- U; M( m; q5 n
        {
6 ^# {0 K  q- I3 M+ n0 `- ^$ o                perror("open error");1 K. G# T+ Z1 K0 C6 k" g- d
                return -1;
2 V1 p  _, j2 ]        }8 h4 o* A0 G2 `4 y
        8 K; ^3 B1 C+ g/ T( S( g) g$ O% }4 n9 Q
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
$ w  ^5 F) s2 I! Q
8 g+ S3 G( H( x; d" I        while(1)0 J" @% l/ ~3 I) S1 m
        {
9 K" |" {% Q5 A' D3 o+ W" G) b3 d                read_MSG_buffer(mem);0 O/ w8 e) c% T2 v! F2 n
        }                5 w( D) h0 y6 N2 g8 y4 V
}0 m0 M- F% f! v7 J: j

7 e: m+ ^# k9 d) H3 n% wvoid read_MSG_buffer(int *baseaddr)
( I: N  L# O) N8 U" y/ U1 L{
' u6 ]7 ?6 h5 z5 l  G9 f, G# o( \        pRX_MSG_PROTOCOL pshreRAM = NULL;% A. r9 p2 S' q1 m, Z& j+ B. @5 M) O
% ?9 o8 F' @3 K- t
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
4 a! @9 c, x% Q- E/ H6 F/ p1 w
) t5 O' Q3 j* l0 R        if(pshreRAM->packet_cout != count_copy)
% _5 k! ]' c- |, T) y        {' p0 f( M% z* X- }$ H+ ?+ t4 t( d
                printf("a is %d\n", pshreRAM->a);
. q* |: [8 \' T# f                printf("b is %d\n", pshreRAM->b);
4 B# Q& m, e9 Q                printf("count is %d\n", pshreRAM->packet_cout);
* t6 ?% A) u9 b+ a3 j                count_copy = pshreRAM->packet_cout;; W# y: n" y8 S6 j3 ~
        }9 |, q: B! Z: f
        else4 b3 b, Y) M, Y/ `
        {
- L) @, L" v2 R/ N; v                printf("No effective message!\n");/ d, T" g* X/ C9 m
        }
& D7 h- l2 y' l* k% s9 V* w}! V4 U! F2 H) c. h
& z/ i; O- ?. @  q7 d6 J2 a1 A+ U
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???7 v2 T1 H! q. o- v
5 K0 m+ s' r0 L1 A4 t5 H

7 ?7 v6 o5 F% Z) ]/ R
  [9 @9 x) L/ r1 z4 k0 ?  j4 A* k
) k; C; `& ?0 @1 |+ T7 A6 }/ `
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-28 15:51 , Processed in 0.046208 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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