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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
4 H) h3 H! E, Z& C8 p; L- P+ o( F/ F/ B( a. D* Y4 j
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
5 u8 H# G& Y/ }- N#include <unistd.h>
. r2 ?# Q4 f! F#include <sys/mman.h>: ~2 C# O# v! O6 M+ g! S9 C) s
#include <sys/types.h>1 U, i, X" N7 |$ j
#include <fcntl.h>
' p- u/ V9 i3 U, h5 L4 w. J2 \" `; b
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
1 y* u4 Q  u* \5 s" \. G5 u$ h% E  k2 F3 R' a
typedef struct1 t7 M3 l/ @$ \) ]& G0 a3 [6 i- e! e
{
# M& T, }3 y. g2 a! X5 [, L8 D        unsigned int a;
6 a3 e* S% L4 O/ [$ {        unsigned int b;( K3 C3 x* a1 t" d) n! p
        unsigned int packet_cout;
* q7 d2 Q2 q& X* @}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;# Y3 g) \8 g6 B5 w! Q& P! U
+ U. F3 V8 J& q* |" y$ M9 a
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
' r/ V9 ]' _1 G3 |9 Punsigned int count_copy = 0;
4 a6 R2 g# v% E" m, ?2 k
; c* b1 p! @9 X4 R9 x" c! W  h( y- u1 i) g+ H
int main()" |' r% P/ B, ]" J
{/ M$ r4 N: o2 V. w
        pRX_MSG_PROTOCOL pshreRAM = NULL;/ I8 i( U- _/ `5 m0 i
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;+ f! l8 \  k7 @8 v& z8 a
& F8 B- y9 e, n* a
        while(1)" T( M8 Q/ j6 @: B( z
        {
8 V  \5 K* O. p                read_MSG_buffer(pshreRAM);/ F8 y3 X. R% B  N
        }               
0 v$ w) K8 b0 L}
- q( V) K8 t: W) i5 m! Q
' p, ?$ }" t8 q! q0 Wvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)  R1 Y! Y! b/ u  ]  L
{
" h' \) I" Z- [. g) x        RX_MSG_PROTOCOL buf;
* R' X' ]$ v0 r        6 U" ]- ^2 a+ M' U
        buf.a = pshreRAM->a;+ M. }! I# Y( V2 t% `! v
        buf.b = pshreRAM->b;3 d1 T2 z& F2 j1 w  q
        buf.packet_cout = pshreRAM->packet_cout;! m9 s& ^" O7 x- Z. j* `2 s
        * R# }9 c( g5 l8 @6 V; J
        if(buf.packet_cout != count_copy)0 Q/ g4 m* z$ G$ U+ H
        {: g9 R9 u1 h  ?5 k- b, u( m
                printf("a is %d\n", buf.a);
4 N4 o1 b& Y+ i+ p4 ^: o* `6 |                printf("b is %d\n", buf.b);8 ?8 @; x1 ?4 o. h8 X
                printf("count is %d\n", buf.packet_cout);2 z. U3 c& G: y
                count_copy = buf.packet_cout;: y9 R& S2 F' l2 x3 Y9 o
        }' x+ o+ S+ S+ R. g% d
        else: F- b7 M1 d! f
        {* l* h/ }2 n0 n+ _: r  @- G
                printf("No effective message!");' V8 S- G. n. z5 Y
        }
8 m6 N1 V' V" l}" p0 |' {. c9 X* G
. u  {0 b" e; q
$ _( S8 Z3 n: `
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。0 Y, Q  f) `1 v+ R9 R% _4 u
使用下面代码,对内存使用了mmap函数后:
$ m5 s% p3 Y5 b# ~2 u1 j8 ~4 P1 `#include <stdio.h>, x5 ^- K% U& e
#include <unistd.h>/ _7 v4 D% e2 Q5 @$ y4 X
#include <sys/mman.h>
$ A4 Q6 [! e0 c. X/ Z#include <sys/types.h>; b* o' _% F$ ~# X2 ^
#include <fcntl.h>
) Q$ r% h7 H# N. D9 l3 H
% B* [0 Y; ~) W, }' `# r& _- c. o#define SHAER_RAM_BASE_ADDR    (0x80000000)7 K, B3 z7 l* Z8 M+ [' K+ E; F" T
#define SHAER_RAM_SIZE         (0x20000)   
- ~% x+ m9 o$ H) l+ l4 k
2 ^4 i5 n5 j) t3 O) k. i  i! otypedef struct
4 w2 Z  L) H; |9 k6 t: O2 d{) `" w$ |9 j8 W8 B: t
        unsigned int a;- l! i+ [1 l6 {. W5 y9 j, P' a
        unsigned int b;* w3 U. f& u0 Z8 ^% {; p
        unsigned int packet_cout;7 D, L7 K7 |2 w# l7 u
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;' }+ Z6 o% Z! W" C; m

: s. I1 T* |4 r; C3 Evoid read_MSG_buffer(int *baseaddr);
0 b1 U8 \4 p8 z: o- ~9 D- Cunsigned int count_copy = 0;
3 S5 ], ~, J/ P$ ?/ ~% S. L5 P* e% t8 A4 P* x" h: _
int main()+ ~, _  O- B) h, ?
{: o+ T' W+ R$ U/ R% j6 ~1 O
        int fd;
' R7 a7 _% h4 L1 m% b& ~        int *mem = NULL;0 A! ~$ a6 Z) V  W: f/ C4 x! e9 I

$ d- Z; }) V6 ^        if((fd = open("/dev/mem", O_RDWR)) <0)4 T. G# {7 f* E- H+ [9 i
        {
5 S  U# x1 \) {* M" S$ K                perror("open error");
4 Y( q& D' t6 s0 M" ?                return -1;* K4 r1 c3 I6 n' _% q' G
        }
. d# f) b; B  Q) h        
1 e$ e: h& N( Q& \$ J/ w3 X        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);# b. V; }' V( P* P  g! D5 K
( J5 `# q0 \- Q& c/ b! @! Z
        while(1)
2 v- m1 t" m% g; `        {6 w: x2 |) N% t8 E+ p0 S: A& E
                read_MSG_buffer(mem);+ V7 p( l2 B" w3 U
        }               
) b$ }  r' x! z; L, t8 A+ }+ C}
! h  S* ^3 @7 P. A; V. E) L7 }, X! B; ]9 e
void read_MSG_buffer(int *baseaddr)7 A( ]: I1 B/ D! l5 n# O
{
- t" h  Z; J( A1 H1 `' @        pRX_MSG_PROTOCOL pshreRAM = NULL;
- D) G. \$ ~2 X/ Y+ x- x$ n7 I2 Y) V6 n# Z! e
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
  b* u# v# {7 b9 ^6 V' W& v& O3 Y. _4 _7 b5 E' a
        if(pshreRAM->packet_cout != count_copy)
/ \, b0 ?$ u( `1 z1 |. ?) i        {
" n6 P3 V/ x0 P1 ?) J" b                printf("a is %d\n", pshreRAM->a);
* q! u2 O8 L5 x3 @                printf("b is %d\n", pshreRAM->b);
. B4 i( ]6 Q) P0 H& k% s                printf("count is %d\n", pshreRAM->packet_cout);
7 H  w6 J6 a" d" J                count_copy = pshreRAM->packet_cout;% k7 b8 d. J6 n" Y7 I
        }
6 g4 _! x( \8 v' f, _. j9 e5 x        else
: l$ b) z( I, z, D. ?6 S# C        {
; \1 N9 q1 t) N$ O- A; s$ w                printf("No effective message!\n");4 i! d1 v6 l% a% {# [  A
        }
+ `4 X: @9 ]9 I, N# k" ~6 O}4 K8 S2 L! @9 O
3 W5 I* B: @5 H* v% ?
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
9 o$ n  \! X) P$ J' z# d
9 V5 Q5 w  {: Q% X
# W$ _# F3 F" A3 R- R8 F6 o1 ]: d7 B  L) F7 q2 Q) l' Z+ i; E6 g
5 |  A( `* O  @/ q
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-18 20:08 , Processed in 0.041041 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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