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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 9 i% ?1 L: ~' e2 _

( S" [5 G$ r, J& V9 H3 `1 sOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
  F% _. `5 }$ W* K% Q#include <unistd.h>
6 Y# {) i. T) |. ^$ z* P#include <sys/mman.h>
/ H* v( b$ ]% n" g! E: H$ }6 M2 f3 ^#include <sys/types.h>
/ h/ q/ |. C3 C. N6 F#include <fcntl.h>
; @) E% |0 P# s# ^0 t9 ^8 B$ h
#define SHAER_RAM_BASE_ADDR    (0x80000000)   * e* {0 s' G/ }5 F2 X

3 v% @# d+ O1 J4 atypedef struct) O. X; _+ l8 B! b$ H
{( ]# b, }7 N, L5 s
        unsigned int a;
5 X9 y0 k* l0 N9 v% U( ?        unsigned int b;7 \+ M3 l7 ~, \7 J3 _5 r' E
        unsigned int packet_cout;
1 f, H; b$ F8 ]: {}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;; X9 Z! G6 L9 W  L; I  H/ Z

( l. l/ _6 R/ mvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);: a& n2 D' W8 w7 c" N8 R" P
unsigned int count_copy = 0;& D2 i5 x+ f, R; |  a: N1 z

3 m, X8 E0 w5 h
( J6 u  J0 k$ g1 A9 m" `int main(). l: L. ^+ d; u
{7 ~& t, T4 V2 O& e: R, F
        pRX_MSG_PROTOCOL pshreRAM = NULL;/ b: R# _6 x7 U8 t; q1 q6 U
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;* R. Q7 {2 B" y1 p

8 `* F& K" u5 A3 `3 I        while(1)
, y% A% U; |& ^( X; i4 P        {; s! n+ x: \  E# M4 e$ ?3 e) m
                read_MSG_buffer(pshreRAM);7 O6 A2 u, O0 J5 Y
        }                4 e, h" ?+ A' y& G, Q" s0 |5 I
}4 T! X. W% ^9 M( }! }* Z' V
" u4 U9 J2 P3 Q, S( E( r0 ]. E5 ^
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)( b: {1 [, w% s  K# W0 [
{
& u8 N# O( R3 O4 o9 {        RX_MSG_PROTOCOL buf;& M. ~( y6 R1 E+ P0 V$ E
        
* d% ^6 Q2 y  a. \5 ], x1 j        buf.a = pshreRAM->a;; j+ b6 G' |" v" `+ b7 K
        buf.b = pshreRAM->b;
  e, L+ c8 Q8 |+ `- |( D4 q  S. {        buf.packet_cout = pshreRAM->packet_cout;
! U% k  K) j, N5 E        1 V% @7 c* q3 z8 W
        if(buf.packet_cout != count_copy)+ q( W( B+ h7 I8 N
        {
/ O" _% y  Z) k6 `; z" L3 l" z                printf("a is %d\n", buf.a);
; G' p2 ~7 s+ s                printf("b is %d\n", buf.b);
% h: m/ a4 N. }+ ~" H                printf("count is %d\n", buf.packet_cout);
' W& Z& }- W0 ?- A1 A                count_copy = buf.packet_cout;
+ R, b1 K$ G# b8 f        }/ ?2 s  {" k6 x7 X, m
        else3 y( ~4 _' r5 M2 X
        {& l& W- l, g, m. H" _0 U
                printf("No effective message!");; a2 e* b" N8 T) K' a7 g' ~2 H
        }
8 M+ V1 \$ V) h! a8 U0 [/ x5 x. h}6 L. ?1 Q% p# A6 I* w

) s4 |) j& [( k$ k) M' W4 Z, c; _) }' Q8 W) u7 [' R0 t
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
* t" X1 t6 W; I1 O6 U使用下面代码,对内存使用了mmap函数后:
$ b0 t* M% f6 {. D  f9 t( v#include <stdio.h>
) T; q+ T: R" @  @4 p9 e" V#include <unistd.h>! G  P$ M0 ]# ~7 q
#include <sys/mman.h>% L' {' ?. i+ f* P
#include <sys/types.h>
, _, R2 D2 L3 N* K; t5 p2 Y#include <fcntl.h>2 W- C5 K' x, Y9 n
+ [  _: i: M3 i  G/ u+ W5 i) ]
#define SHAER_RAM_BASE_ADDR    (0x80000000)/ s# m- ^6 q# t
#define SHAER_RAM_SIZE         (0x20000)   
! z9 Y7 x# w# ~0 l, V3 j4 P7 q& o! f# M
typedef struct) @$ ^( i! C! e; P
{, \% X: e, [  d4 s$ O
        unsigned int a;
( k3 d0 c6 o2 `% ~6 f& F1 n0 G+ }        unsigned int b;+ D0 R* X" T; T0 A# C
        unsigned int packet_cout;
% C! [, R  e* I* C/ _0 f, Z) U}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. v, {$ D7 u. r0 l8 u2 V% O% ?; ~
void read_MSG_buffer(int *baseaddr);' L* O2 P# _# y! {3 a0 A( u' r$ N
unsigned int count_copy = 0;7 k! P- h% r9 i+ i- |0 w1 y" y. G

6 j" H9 X0 n' w5 sint main()
0 u  G: w8 Z3 M7 s; @' I2 ~{; X% i7 I$ L9 i/ n8 _# p
        int fd;0 {1 y3 i% [: X! e
        int *mem = NULL;
- {6 C5 a3 g- Y0 u' @' c
9 O* K( Q% C) m6 q# E        if((fd = open("/dev/mem", O_RDWR)) <0)
' m+ T+ p) `. G! X' ^4 D; D) s        {
7 k( `8 G- O2 r" w1 ^                perror("open error");
8 _( a, Q9 G$ k! G2 ^6 ^5 Q                return -1;
4 X+ J1 X; @  o8 v        }
. T& K1 n/ B  H3 f* q        $ P+ ]& ^1 d1 k0 c+ u
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
' l+ C+ U* c9 E0 C) |0 i$ _- W
' H5 ]) t( s, F& v3 p+ a        while(1)
9 X+ @- e& q$ ~  M        {9 f; m" k& e: `- q, h
                read_MSG_buffer(mem);
3 i0 B+ r! u. U0 u1 \        }                * r( b6 m% T( U8 L) V) ]9 _
}! N; l% j1 K* f) ^7 D  k
4 O& f' [) z0 x. b. h; |6 a
void read_MSG_buffer(int *baseaddr)5 d6 O9 B% J  y! l
{" ^  x* h' w& `- V2 e
        pRX_MSG_PROTOCOL pshreRAM = NULL;' M# |: H* Q" ~) _- h

) l5 r6 P% |6 X7 M        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;. @4 o& W& ~" i
' V5 N# r& j" c
        if(pshreRAM->packet_cout != count_copy)
& r2 O+ t& d' u& K2 j4 x" r5 c; c7 S        {
: v" n$ P% k8 \                printf("a is %d\n", pshreRAM->a);
4 ]$ ?& f5 `) M& }/ b( ?                printf("b is %d\n", pshreRAM->b);
" p# ~: `3 b# @- |% j- Y$ T  W' N6 k                printf("count is %d\n", pshreRAM->packet_cout);# V( A: q( B% R& [4 `. @
                count_copy = pshreRAM->packet_cout;
. b! o0 V- B0 ~. ?+ ~; k" e) N        }: W9 p3 e, a$ _0 V9 G
        else, c6 a6 N# C- Z* H: D# I' ]
        {* O! }& N/ U6 [; w' k8 Z
                printf("No effective message!\n");3 C& c0 e& l$ Q$ W/ H
        }# \- R3 B6 _+ x% X# n$ [
}6 T' ?& P' H: o& W' t
% r+ I( N4 R% b) w
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???' K+ ^+ _: i& Q+ L8 x. |* p

2 {8 U+ _" Z% E( k8 N; v/ V; `" R! w3 I

4 o- L2 i2 J* z7 n' B8 o0 G
6 J& _+ i: D, w: |! Q% U6 j0 p
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-11 19:21 , Processed in 0.040855 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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